Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

355
Vistas
¿Cómo manejar la migración de modelos cuando los almacena en UserDefault?

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.

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

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 } }
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda