Итерация по JSON и сохраненные указатели в Swift - PullRequest
0 голосов
/ 05 февраля 2020

После получения полезной нагрузки JSON от веб-запроса мне нужно проанализировать данные в переменные в подклассе NSObject.

Мои переменные объявлены в объекте:

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

Затем я начинаю анализировать все возможные данные, которые JSON может вернуть:

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
}

Это становится довольно длинным, так как у нас много данных.

Я был желая закорочить его с помощью Dictionary, содержащего клавишу JSON и variable, например:

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

Затем выполните итерации по ним следующим образом:

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

Проблема здесь в том, что Dictionary копирует значение из переменной, а не указатель на нее, поэтому установка его на новое значение не влияет на переменные всего объекта.

Есть ли способ добиться того, что я пытаюсь? Если нет, какой другой шаблон был бы лучшим способом сделать это вместо множества if операторов?

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Для анализа JSON вы можете просто использовать Codable типов.

Предположим, что ваш JSON выглядит ,

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

Модели:

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

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

Parse JSON data вроде так,

do {
    let response = try JSONDecoder().decode(Root.self, from: data)
    print(response) //use response here...
} catch {
    print(error)
}
1 голос
/ 05 февраля 2020

Для этого можно использовать функцию updateValue, она находит свойство и изменяет его.

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

Таким образом, вы для итерации:

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

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

После обновления словаря вы можете назвать эту часть;

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
}

Я считаю, что эта часть в Функция, если это не так, вы можете изменить его.

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

...