web-dev-qa-db-fra.com

Swift Codable Decode Manuellement Variable facultative

J'ai le code suivant:

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)

Le problème est qu'il plante sur age = try values.decode(String.self, forKey: .age). Quand je retire cette fonction init, cela fonctionne très bien. L'erreur est No value associated with key age (\"age\")..

Avez-vous des idées sur la façon de rendre cela facultatif et de ne pas le faire planter lorsqu'il n'existe pas? J'ai également besoin de cette fonction init pour d'autres raisons, mais je viens de créer un exemple simple pour expliquer ce qui se passe.

15
Charlie Fish

L'âge est facultatif:

let age: String? 

Essayez donc de décoder de cette manière:

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