Search code examples
iosswiftserializationprotocolscodable

Using JSONEncoder to encode a variable with Codable as type


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

Solution

  • 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
    }