【发布时间】:2018-11-26 13:03:09
【问题描述】:
假设我有 Opportunity 类,带有可选的 code 字段
class Opportunity: Codable {
let id: String
let code: String?
enum OpportunityKeys: String, CodingKey {
case id = "opportunityId"
case code = "opportunityCode"
}
required init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: OpportunityKeys.self)
id = try values.decode(String.self, forKey: .id)
if let code = try? values.decode(String.self, forKey: .code) {
self.code = code
}
}
}
有没有比使用 if let 更好地解析 nil 值的方法?
【问题讨论】:
-
@Larme,感谢您指出这一点,但我要问的是有没有比 if let 更好的方法来解析 nil 值。另一个问题是询问 decode 和 decodeIfPresent 之间的区别。我相信他们是不同的!你怎么看?
-
如果可以为零,则使用
decodeIfPresent(),如链接问题和@vadian所述。 -
为了将来参考,
decodeIfPresent是在合成的init(from:)中调用可选属性的默认方法。这意味着如果您让编译器合成它(将OpportunityKeys重命名为CodingKeys并删除您的init(from:)实现),您将获得相同的行为。