Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

363
Visualizações
¿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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda