men*_*sai 2 swift codable decodable
假设我想按如下方式解码 Person 结构。
struct Person: Decodable {
let firstName: String
let lastName: String
let age: Int: String
}
Run Code Online (Sandbox Code Playgroud)
据我所知,数据只能用上面的方法解码。因此,如果我不将属性更改为自定义名称,如果上面和下面的实现没有区别?
此外,还有其他情况需要使用 CodingKeys 吗?除了重命名目的之外,当它们是必要的时,我很困惑。
struct Person: Decodable {
let firstName: String
let lastName: String
let age: Int: String
}
enum CodingKeys: String, CodingKey {
case firstName
case lastName
case age
}
Run Code Online (Sandbox Code Playgroud)
小智 6
您可以以不同的方式使用 CodingKeys,例如,当您知道 JSON 中期望的值名称至少之一实际上与您的“let 或 var”名称不同时。
例子:
struct Person: Decodable {
let firstName: String
let lastName: String
let age: Int: String
}
enum CodingKeys: String, CodingKey {
case firstName = "first_name"
case lastName
case age
}
Run Code Online (Sandbox Code Playgroud)
另一种情况是当您使用类继承时。
总之,如果您绝对确定您使用的变量名称与编码密钥(JSON)相同,则可以省略它(但如果您想放置它,也没关系),但如果有区别,也许更改了您的编码键(例如大写或使用不同的单词),您应该使用枚举将正确的键与变量名称映射。
首先,使用时有一个成败规则CodingKeys:
CodingKeys如果 JSON \xe2\x80\x93 或任何符合格式的 \xe2\x80\x93 键与相应的属性完全匹配Codable(如您的示例中所示),或者转换由适当的keyDecodingStrategy.
否则,您必须指定所有 CodingKeys需要解码的内容(另请参阅下面的原因#3)。
使用的三个主要原因CodingKeys:
CodingKey才能解码该密钥。id不在 JSON 中且使用UUID常量初始化的属性。CodingKeys如果您实现init(from decoder解码带密钥的容器,则这是强制性的。