I managed to get both JSON and plist encoding and decoding working, but only by directly calling the encode/decode function on a specific object.
For example:
struct Test: Codable { var someString: String? } let testItem = Test() testItem.someString = "abc" let result = try JSONEncoder().encode(testItem)
This works well and without issues.
However, I am trying to get a function that takes in only the Codable
protocol conformance as type and saves that object.
func saveObject(_ object: Encodable, at location: String) { // Some code let data = try JSONEncoder().encode(object) // Some more code }
This results in the following error:
Cannot invoke 'encode' with an argument list of type '(Encodable)'
Looking at the definition of the encode function, it seems as if it should be able to accept Encodable
, unless Value
is some strange type I don't know of.
open func encode<Value>(_ value: Value) throws -> Data where Value : Encodable
If all the properties of a type already conform to Codable , then the type itself can conform to Codable with no extra work – Swift will synthesize the code required to archive and unarchive your type as needed.
The simplest way to make a type codable is to declare its properties using types that are already Codable . These types include standard library types like String , Int , and Double ; and Foundation types like Date , Data , and URL .
Codable allows you to insert an additional clarifying stage into the process of decoding data into a Swift object. This stage is the “parsed object,” whose properties and keys match up directly to the data, but whose types have been decoded into Swift objects.
Use a generic type constrained to Encodable
func saveObject<T : Encodable>(_ object: T, at location: String) { //Some code let data = try JSONEncoder().encode(object) //Some more code }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With