何时在 Decodable(Swift) 中使用 CodingKeys

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)相同,则可以省略它(但如果您想放置它,也没关系),但如果有区别,也许更改了您的编码键(例如大写或使用不同的单词),您应该使用枚举将正确的键与变量名称映射。


vad*_*ian 6

首先,使用时有一个成败规则CodingKeys

\n
    \n
  • CodingKeys如果 JSON \xe2\x80\x93 或任何符合格式的 \xe2\x80\x93 键与相应的属性完全匹配Codable(如您的示例中所示),或者转换由适当的keyDecodingStrategy.

    \n
  • \n
  • 否则,您必须指定所有 CodingKeys需要解码的内容(另请参阅下面的原因#3)。

    \n
  • \n
\n
\n

使用的三个主要原因CodingKeys

\n
    \n
  1. Swift 变量/属性名称不得以数字开头。如果密钥确实以数字开头,则必须指定兼容CodingKey才能解码该密钥。
  2. \n
  3. 您想要使用不同的属性名称。
  4. \n
  5. 您希望排除密钥被解码,例如id不在 JSON 中且使用UUID常量初始化的属性。
  6. \n
\n

CodingKeys如果您实现init(from decoder解码带密钥的容器,则这是强制性的。

\n