Swift Codable解码手动可选变量
问题描述:
我有以下code。Swift Codable解码手动可选变量
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\").
。
任何关于如何使这个可选的想法,并没有崩溃时,它不存在?由于其他原因,我也需要这个函数,但只是一个简单的例子来解释发生了什么。
答
年龄是可选的:
let age: String?
因此,尝试用这种方式来解码:
let age: String? = try values.decodeIfPresent(String.self, forKey: .age)
+0
太棒了,非常感谢!堆栈溢出不会让我再接受几分钟。他们让我的时候会这样做。 –
答
这是为我工作。
var age: String? = nil
age = try? container.decode(String.self, forKey: .age)
希望得到帮助。
比较[使用Decodable for JSON解析时可选和decodeIfPresent之间有什么区别?](https://stackoverflow.com/questions/46292325/what-is-difference-between-optional-and-decodeifpresent-when-using -decodable换)。 –
@MartinR非常有帮助!非常感谢。 –