/ / чому метод Decode в swift4 дає об'єкту нуль, якщо в json є один тег корисного навантаження має невідповідність типу - ios, swift

чому метод декодування в swift4 дає об’єкт нуль, якщо є один тег у json корисного навантаження має невідповідність типу - ios, swift

Я використовую json корисне навантаження, як показано нижче

{
"name": "Dog",
"type": 1
}

а клас, який я хочу перетворити з json на власний тип, наведений нижче

class Animal: Codable {
var name: String?
var type: String?
}

Процес декодування:

let decoder = JSONDecoder()
var animal: Animal?

do {
animal = try decoder.decode(Animal.self, from: data)
} catch DecodingError.keyNotFound(let key, let context) {

} catch DecodingError.valueNotFound(let type, let context) {

} catch DecodingError.typeMismatch(let type, let context) {
print("mismatch")
}
catch {
print("some error (error.localizedDescription)")
}

print(animal?.name ?? "Decode did not happen!")

Об'єкт тварини - нуль. Однак, згідно з розмовою про WWDC щодо яблук (https://developer.apple.com/videos/play/wwdc2017/212/) він повинен присвоїти значення nil для властивості type. Оскільки існує невідповідність даних "типу". (Очікуваний рядок, але Int знайдено)

Чи можете ви здогадатися, в чому причина цього? Якщо будь-який тип даних тегу не відповідає, тоді весь об'єкт стає нульовим, це не звучить добре для мене.

Відповіді:

1 для відповіді № 1

Будь ласка, уважно прочитайте повідомлення про помилку, причина дуже чітка (не потрібно здогадатися)

Очікуваний рядок, але Int знайдено

означає (знайдене) значення Int але ви оголосили String власність

Все рядки в JSON обертаються подвійними лапками типу type є Int

class Animal: Codable {
var name: String?
var type: Int?
}

Якщо JSON завжди містить обидва значення, оголошують властивості як необов’язкові, видаляючи знаки запитання.

Неявний декодер / ініціалізатор виходить з ладу, якщо будь-який виникає помилка, це ви можете побачити просто з синтаксису коду. Якщо ви хочете мати більш точний контроль, напишіть свій власний ініціалізатор.