es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Decodificar una variable única de forma diferente en una estructura decodable.

Estoy tratando de decodificar una variable única que se envía como una cadena hexadecimal en un UInt32 mediante la creación de un init() personalizado en una estructura Codable, pero me gustaría que las demás variables se decodifiquen automáticamente.

struct MyStruct: Decodable {
  var bits: UInt32
  var other1: Double
  ... // hay 20 claves más

  init(from decoder: Decoder) throws {
     let container = try decoder.container(keyedBy: CodingKeys.self)
     if let string = try? container.decode(String.self, forKey: .bits) {
       self.bits = convertToUInt32(string)
     }
     // ¿Hay alguna manera de decodificar las demás claves automáticamente?
     ???
  }
}

El JSON que recibo es:

{
  "bits": "1a2b3fdd",
  "other": 12.34,
  ...
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, puede decodificar automáticamente las claves restantes llamando a super.init(from:), lo que decodificará las propiedades restantes utilizando sus respectivos tipos. Aquí hay una versión actualizada del código:

    struct MyStruct: Decodable {
        var bits: UInt32
        var other1: Double
        // hay 20 claves más
    
        private enum CodingKeys: String, CodingKey {
            case bits
            case other1
            // agregar aquí las claves restantes
        }
    
        init(from decoder: Decoder) throws {
            let container = try decoder.container(keyedBy: CodingKeys.self)
            if let string = try? container.decode(String.self, forKey: .bits) {
                self.bits = convertToUInt32(string)
            } else {
                throw DecodingError.dataCorruptedError(forKey: .bits, in: container, debugDescription: "bits debe ser una cadena hexadecimal válida")
            }
            try super.init(from: decoder)
        }
    }
    

    Tenga en cuenta que agregamos un enum privado CodingKeys para declarar las propiedades que se decodificarán manualmente. Esto es necesario cuando desea decodificar algunas claves manualmente y otras automáticamente. También lanzamos un DecodingError personalizado si bits no es una cadena de caracteres hexadecimal válida. Por último, llamamos a super.init(from: decoder) para decodificar automáticamente las claves restantes.

Comments are closed.