Ответ 1
Возраст не является обязательным:
let age: String?
Поэтому попробуйте декодировать таким образом:
let age: String? = try values.decodeIfPresent(String.self, forKey: .age)
У меня есть следующий код.
import Foundation
let jsonData = """
[
{"firstname": "Tom", "lastname": "Smith", "age": "28"},
{"firstname": "Bob", "lastname": "Smith"}
]
""".data(using: .utf8)!
struct Person: Codable {
let firstName, lastName: String
let age: String?
enum CodingKeys : String, CodingKey {
case firstName = "firstname"
case lastName = "lastname"
case age
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
firstName = try values.decode(String.self, forKey: .firstName)
lastName = try values.decode(String.self, forKey: .lastName)
age = try values.decode(String.self, forKey: .age)
}
}
let decoded = try JSONDecoder().decode([Person].self, from: jsonData)
print(decoded)
Проблема в том, что он разбивается на age = try values.decode(String.self, forKey:.age)
. Когда я беру эту функцию init
, она работает нормально. Ошибка: No value associated with key age (\"age\").
,
Любые идеи о том, как сделать этот факультативный и не иметь его сбой, когда он не существует? Мне также нужна эта функция init
по другим причинам, но просто сделал простой пример, чтобы объяснить, что происходит.
Возраст не является обязательным:
let age: String?
Поэтому попробуйте декодировать таким образом:
let age: String? = try values.decodeIfPresent(String.self, forKey: .age)
Это работа для меня.
var age: String? = nil
age = try? container.decode(String.self, forKey: .age)
Надеюсь на помощь.