Tengo un objeto llamado User que se ajusta a Codable introducido en Swift4.
por ejemplo, este objeto solía ser
struct User: Codable { var firstName: String } y usamos PropertyListDecoder().decode(User.self, from: data) y PropertyListEncoder().encode(value) para codificar el User en Data y decodificar Data en User .
Ahora actualizamos el objeto para que sea
struct User: Codable { var firstName: String var isLoggedIn: Bool } Si nuestra aplicación se actualizó desde la aplicación anterior que tiene los Data antiguos almacenados en UserDefault . Lo primero que hará la aplicación después de la actualización es obtener estos Data e intentar decodificarlos en User mediante PropertyListDecoder().decode(User.self, from: data) . Pero, da un error:
po PropertyListDecoder().decode(User.self, from: data) ▿ DecodingError ▿ keyNotFound : 2 elements - .0 : CodingKeys(stringValue: "isLoggedIn", intValue: nil) ▿ .1 : Context - codingPath : 0 elements - debugDescription : "No value associated with key CodingKeys(stringValue: \"isLoggedIn\", intValue: nil) (\"isLoggedIn\")." - underlyingError : nil¿Alguna idea de cómo manejaría la migración del modelo en este caso? Sé que para Coredata hay algunas maneras fáciles de lidiar con esto, pero no tengo idea de cómo lograrlo en UserDefault.
Puede implementar el inicializador de decodificación y establecer un valor predeterminado para isLoggedIn si no hay ninguno:
struct User: Codable { var firstName: String var isLoggedIn: Bool enum Keys: CodingKey { case firstName case isLoggedIn } public init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) firstName = try container.decode(String.self, forKey: .firstName) isLoggedIn = try container.decodeIfPresent(Bool.self, forKey: .isLoggedIn) ?? false } }