Как реализовать кодируемый для массива словаря с динамическими ключами для использования Swift 4 - PullRequest
0 голосов
/ 20 июня 2019

Ответ API выглядит следующим образом

  "status": "SUCCESS",
  "mobile": "8856969696",
  "demo": [
    {
      "data1": "some"
    },
    {
      "data2": "value"
    }
  ],
  "pay": "12",
}

и я пытаюсь разобрать вот так

struct demoModel : Codable {
    let status: String?
    let mobile: String?
    let demo : [demoData]?
    let pay: String?
    enum CodingKeys: String, CodingKey {

        case status = "status"
        case mobile  = "mobile"
        case demo = "demo"
        case pay = "pay"

    }

    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        status = try values.decodeIfPresent(String.self, forKey: .status)
        mobile  = try values.decodeIfPresent(String.self, forKey: .mobile )
        demo = try values.decodeIfPresent([demoData].self, forKey: .demo)
        pay = try values.decodeIfPresent(String.self, forKey: .pay)

    }

}
struct demoData : Codable {
    let data1: String?

    enum CodingKeys: String, CodingKey {

        case data1 = "data1"
    }

    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        data1 = try values.decodeIfPresent(String.self, forKey: .data1)
    }

}

Здесь ответ содержит массив словаря с динамическими ключами. Пожалуйста, помогите мне с тем, как создать кодируемый для динамических ключей. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

попробуйте так.

class apiResponse{
 var status: String?
 var mobile: String?
 var demo = [[String:Any]]()
 var demoKeys = [String:Any]()

 init(json: [String:Any]){
     self.status = json?["status"] as? String ?? ""
     self.mobile = json?["mobile"] as? String ?? ""
     self.demoKeys = (json?["demo"] as AnyObject) as? [String:Any] ?? [:] 
     for item in demoKeys.keys{
         self.demo.append(json[item] as! [String:Any])
     }
 }
}
0 голосов
/ 20 июня 2019

Пожалуйста, помогите мне, как создать кодируемый для динамических ключей.

Ну, а Codable протоколы не предназначены для динамических ключей, вам нужно явно объявить каждый ключ, это невозможно для Codable.

Вы должны будете использовать [[String: String]] для этих динамических клавиш.

Подумайте об этом так, пока нет никакого определенного статического ключа, связанного со значением, тогда все обрабатывается как значение чего-либо, поэтому в вашем случае demo является ключом и динамическим словарем это окончательное значение, которое вы не можете декодировать, поскольку для декодирования требуется ключ для декодирования значения, поэтому у вас не может быть динамических ключей.

...