Swift Codable手动解码可选变量

查理·菲什(Charlie Fish):

我有以下代码:

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由于其他原因,我也需要该函数,但仅举了一个简单的示例来说明发生了什么。

奥列格·高迪希克(Oleg Gordiichuk):

年龄是可选的:

let age: String? 

因此,尝试以这种方式解码:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章