JSON Кодируемый - Что делать с [Any]? - PullRequest
0 голосов
/ 25 марта 2020

У меня есть JSON со следующей структурой:

         "properties":[

            {

               "name":"Quality",
               "values":[],
               "displayMode":0,
               "type":6
            },
            {

               "name":"Armour",
               "values":[],
               "displayMode":0,
               "type":16
            },
            {

               "name":"Evasion Rating",
               "values":[],
               "displayMode":0,
               "type":17
            }
         ]

API всегда возвращает массив для "value" с первым элементом String, а вторым элементом Int.

    "values":[

                  [
                     "+26%",
                     1
                  ]

               ],

Вот как я до сих пор сопоставил JSON:

struct Properties: Codable {
    var name: String
    var values: [Any]
    var displayMode: Int
    var type: Int
}

В этот момент Xcode жалуется, потому что Type 'Properties' does not conform to protocol 'Decodable'

Итак, я знаю что Any не соответствует codable, но дело в том, что я не умею превращать этот [Any] во что-то, с чем Swift может работать ...

Может кто-нибудь поделиться намеком на решение ?

Большое спасибо:)

1 Ответ

0 голосов
/ 25 марта 2020

Вам необходимо использовать неиспользованный контейнер для этого при декодировании в вашем пользовательском init(from:).

Если вы знаете, что всегда есть одна строка, за которой следует одно целое число, вы можете определить структуру для значений, подобных этой

struct Value: Decodable {
    let string: String?
    let integer: Int?

    init(from decoder: Decoder) throws {
        var container = try decoder.unkeyedContainer()
        string = try container.decodeIfPresent(String.self)
        integer = try container.decodeIfPresent(Int.self)
    }
 }

Если может быть больше элементов, вы можете использовать al oop вместо

struct Value: Decodable {
    let strings: [String]
    let integers: [Int]

    init(from decoder: Decoder) throws {
        var container = try decoder.unkeyedContainer()
        var strings = [String]()
        var integers = [Int]()

        while !container.isAtEnd {
            do {
                let string = try container.decode(String.self)
                strings.append(string)
            } catch {
                let integer = try container.decode(Int.self)
                integers.append(integer)
            }
        }
        self.integers = integers
        self.strings = strings
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...