Сбойные инициализаторы с Codable - PullRequest
0 голосов
/ 23 июня 2019

Я пытаюсь проанализировать следующую схему json массива элементов, itemID может быть не пустым. Как мне сделать элемент nil id itemID не существует в JSON?

[{
    "itemID": "123",
    "itemTitle": "Hello"
  },
  {},
  ...
]

Мои декодируемые классы следующие:

public struct Item: : NSObject, Codable {
    let itemID: String
    let itemTitle: String?
}

private enum CodingKeys: String, CodingKey {
    case itemID
    case itemTitle
}

    required init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)

        itemID = try container.decode(String.self, forKey: .itemID)
        itemTitle = try container.decodeIfPresent(String.self, forKey: .itemTitle)

        super.init()
    }
}

1 Ответ

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

Прежде всего, itemID - это Int, а не String в вашем JSON ответе . Так выглядит struct Item,

public struct Item: Codable {
    let itemID: Int?
    let itemTitle: String?
}

Разобрать JSON как,

if let data = data {
    do {
        let items = try JSONDecoder().decode([Item].self, from: data).filter({$0.itemID == nil})
        print(items)
    } catch {
        print(error)
    }
}

В приведенном выше коде вы можете просто filter из пунктов itemID == nil.

...