Swift Codable Decode вручную Необязательная переменная

У меня есть следующий код.

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 по другим причинам, но просто сделал простой пример, чтобы объяснить, что происходит.

Ответы

Ответ 1

Возраст не является обязательным:

let age: String? 

Поэтому попробуйте декодировать таким образом:

let age: String? = try values.decodeIfPresent(String.self, forKey: .age)

Ответ 2

Это работа для меня.

var age: String? = nil
age = try? container.decode(String.self, forKey: .age)

Надеюсь на помощь.