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

469
Vistas
Swift: ¿hay alguna manera de diferenciar entre un campo que no está presente o un campo que es nulo/nulo al decodificar un valor Codificable opcional?

La funcionalidad necesaria

Estoy en el proceso de modificar un sistema para guardar una cola de solicitudes de API actualmente no enviadas a UserDefaults para que se vuelvan a enviar cuando la conexión del usuario lo permita.

Como algunas solicitudes de parches requieren la capacidad de enviar un valor NULO real a la API (y no simplemente ignorar el campo si es nulo opcional), esto significa que necesito la capacidad de codificar y decodificar valores nulos/NULOS de los valores predeterminados para ciertos campos .

La cuestión

Tengo el lado de codificación hacia abajo y felizmente puedo codificar solicitudes para enviar campos NULOS al servidor o codificarlos en valores predeterminados. Sin embargo, mi problema es que cuando se trata de decodificar solicitudes no enviadas guardadas, no puedo encontrar una manera de diferenciar entre un valor Nil real y el campo que simplemente no está allí.

Actualmente estoy usando decodeIfPresent para decodificar mis campos (todos los campos para estas solicitudes son opcionales), que devuelve cero si el campo está vacío O si el campo está configurado en Nil/NULL. Obviamente, esto no funciona para mis campos que pueden establecerse explícitamente en Nil, ya que no hay forma de diferenciar entre los dos casos.

Pregunta

¿Hay alguna metodología de decodificación que pueda implementar que permita diferenciar entre un campo que no está allí y un campo que realmente se establece en cero?

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

0

No hay forma, pero puedes agregar otra información para saberlo.

 struct Root : Codable { let code : Int? let codeExists:Bool? init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) code = try values.decodeIfPresent(Int.self, forKey: .code) codeExists = values.contains(.code) } }

De acuerdo con los documentos decodeIfPresent

Este método devuelve nil si el contenedor no tiene un valor asociado con la clave, o si el valor es nulo. La diferencia entre estos estados se puede distinguir con una llamada contains(_:).

Entonces decodificando

 let str = """ { "code" : 12 } """

da

Raíz (código: Opcional (12), existe código: Opcional (verdadero))

&&

Este

 let str = """ { "code" : null } """

da

Raíz (código: nil, codeExists: Opcional (verdadero))

y esto

 let str = """ { } """

da

Raíz (código: nil, codeExists: Opcional (falso))

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