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