jsonserialization jsondecoder ios swift serialization protocols codable

ios - jsondecoder - swift 4 object to dictionary



Usando JSONEncoder para codificar una variable con Codable como tipo (2)

Necesitas usar una función genérica con un tipo genérico Encodable

Tu no puedes

func toData(object: Encodable) throws -> Data { let encoder = JSONEncoder() return try encoder.encode(object) // Cannot invoke ''encode'' with an argument list of type ''(Encodable)'' }

Usted puede

func toData<T: Encodable>(object: T) throws -> Data { let encoder = JSONEncoder() return try encoder.encode(object) }

Logré que tanto la codificación como la decodificación JSON y plist funcionaran, pero solo llamando directamente a la función codificar / decodificar en un objeto específico.

Por ejemplo:

struct Test: Codable { var someString: String? } let testItem = Test() testItem.someString = "abc" let result = try JSONEncoder().encode(testItem)

Esto funciona bien y sin problemas.

Sin embargo, estoy tratando de obtener una función que tome solo la Codable protocolo Codable como tipo y Codable ese objeto.

func saveObject(_ object: Encodable, at location: String) { // Some code let data = try JSONEncoder().encode(object) // Some more code }

Esto resulta en el siguiente error:

No se puede invocar ''codificar'' con una lista de argumentos de tipo ''(codificable)''

Mirando la definición de la función de codificación, parece que debería ser capaz de aceptar Encodable , a menos que el Value sea ​​un tipo extraño que no conozco.

open func encode<Value>(_ value: Value) throws -> Data where Value : Encodable


Utilice un tipo genérico restringido a Encodable

func saveObject<T : Encodable>(_ object: T, at location: String) { //Some code let data = try JSONEncoder().encode(object) //Some more code }