Después de recibir una carga útil JSON de una solicitud web, necesito analizar los datos en variables en una subclase NSObject.

Mis variables se declaran en el objeto:

var name:String?
var email:String?
var aboutMe:String?

Luego empiezo a analizar todos los datos posibles que JSON puede devolver:

if let name = json["Name"] as? String
{
    self.name = name
}
if let email = json["Email"] as? String
{
    self.email = email
}
if let aboutMe = json["AboutMe"] as? String
{
    self.aboutMe = aboutMe
}

Esto se está volviendo bastante largo ya que tenemos muchos datos.

Quería acortarlo usando un Dictionary que contiene la tecla JSON y el variable así:

let varMap:[String:Any?] = [
   "Name": self.name,
   "Email": self.email,
   "AboutMe": self.aboutMe
]

Luego iterando sobre ellas de esta manera:

for (key, var variable) in varMap
{
   if let string = json[key]
   {
      variable = string
   }
}

El problema aquí es que Dictionary copia el valor de la variable y no un puntero, por lo que establecerlo en un nuevo valor no tiene ningún efecto en las variables del objeto general.

¿Hay alguna manera de lograr lo que estoy intentando? Si no, ¿qué otro patrón sería una mejor manera de hacer esto en lugar de tener toneladas de declaraciones if?

0
Darren 5 feb. 2020 a las 15:01

2 respuestas

La mejor respuesta

Para el análisis JSON , simplemente puede usar los tipos Codable .

Supongamos que su JSON se ve así,

{
  "name": "Alex",
  "email": "alex@gmail.com",
  "about_Me": "My name is Alex"
}

Modelos:

class Root: Decodable {
    let name: String?
    let email: String?
    let aboutMe: String?

    enum CodingKeys: String, CodingKey {
        case name, email
        case aboutMe = "about_Me"
    }
}

Analizar el JSON data así,

do {
    let response = try JSONDecoder().decode(Root.self, from: data)
    print(response) //use response here...
} catch {
    print(error)
}
1
PGDev 5 feb. 2020 a las 12:51

Puede usar la función updateValue para eso, encuentra la propiedad y la cambia.

if let oldValue = varMap.updateValue(self.name, forKey: "Name") {
    print("The old value of \(oldValue) was replaced with a new one.")
}

Entonces, para la iteración es;

for (key, var variable) in varMap
{
   varMap.updateValue(string, forKey: key )

   //if let string = json[key]
   //{
   //   variable = string
   //}
}

Después de actualizar el diccionario, puede llamar a esa parte;

if let name = json["Name"] as? String
{
    self.name = name
}
if let email = json["Email"] as? String
{
    self.email = email
}
if let aboutMe = json["AboutMe"] as? String
{
    self.aboutMe = aboutMe
}

Creo que parte de una función, si no es así, puede refactorizarla.

https://developer.apple.com/documentation/swift/dictionary/3127179-updatevalue

1
EmreSURK 5 feb. 2020 a las 12:12