Как я могу получить данные из кодируемой структуры, которая может получить пустой массив в качестве одного из своих значений вместо словаря? - PullRequest
0 голосов
/ 24 апреля 2020

Вот моя структура

    struct AFilters: Codable {
            let colors, sizes, materials,lining, price: MaterialsClass?
            //let lining, price: Lining?

       struct MaterialsClass: Codable {
                let id: [Int]
                let name: String
                let items: ItemAny
        }

        enum ItemAny: Codable {
                case anythingArray([JSONAny])
                case itemMap([String: Item])

                init(from decoder: Decoder) throws {
                    let container = try decoder.singleValueContainer()
                    if let x = try? container.decode([JSONAny].self) {
                        self = .anythingArray(x)
                        return
                    }
                    if let x = try? container.decode([String: Item].self) {
                        self = .itemMap(x)
                        return
                    }
                    throw DecodingError.typeMismatch(Extenders.self, DecodingError.Context(codingPath: decoder.codingPath, debugDescription: "Wrong type for Extenders"))
                }

                func encode(to encoder: Encoder) throws {
                    var container = encoder.singleValueContainer()
                    switch self {
                    case .anythingArray(let x):
                        try container.encode(x)
                    case .itemMap(let x):
                        try container.encode(x)
                    }
                }
            }

        struct Item: Codable {
                let name: String
                let value: String?
                let active: Bool
            }
    }
}

Это типы ответов, которые могут исходить от API

"lining": {
   "id": [6],
    "name": "Подкладка",
    "items": []
 }

"materials": {
     "id": [4],
     "name": "Материал",
     "items": {
        "143": {
           "name": "Полиэстер",
            "value": null,
            "active": false
        }
      }
 }

Мне удалось проанализировать этот тип ответов в модели, а затем сохранить его в переменной

var filter = Afilters
filter = list.apiData.aFilters

Теперь я не могу получить данные об элементах, даже если ответ содержит dict

Как получить значения из фильтра?

...