Swift使用Codable时如何自动生成与属性对应的CodingKeys枚举
struct User: Codable { var name: String var createdAt: Date var updatedAt: Date var githubId: Int } extension User { init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) self.name = try container.decode(String.self, forKey: .name) self.createdAt = try container.decode(Date.self, forKey: .createdAt) self.updatedAt = try container.decode(Date.self, forKey: .updatedAt) self.githubId = try container.decode(Int.self, forKey: .githubId) } }
在调用
container.decode方法时,传入的forKey参数是名称与模型属性名一一对应的枚举值,请问该如何实现这种自动生成对应枚举的功能?
这个和属性名一一对应的CodingKeys枚举是Swift编译器自动合成的,不需要手动编写,只要满足Codable协议的自动合成条件就会自动生成:
- 自动生成的触发条件
- 类型明确声明遵循
Codable(也就是Encodable和Decodable的组合协议),或是单独遵循Encodable/Decodable - 类型下的所有存储属性本身也都遵循对应的Codable协议,示例里用到的
String、Date、Int都是标准库默认实现了Codable的类型,直接满足要求 - 没有手动声明自定义的
CodingKeys枚举,也没有编写完全自定义的编解码逻辑阻断编译器的自动合成流程
- 类型明确声明遵循
自动生成的CodingKeys枚举隐式遵循CodingKey协议,每个枚举case的名称和对应存储属性名完全一致,rawValue默认就是属性名的字符串形式,刚好匹配示例里的调用写法。
如果接口返回的JSON字段名和模型属性名完全一致,甚至连示例里写的init(from:)初始化方法都不用手动写,编译器会自动生成和手写逻辑完全一致的解码实现,同时还会自动生成对应的encode(to:)编码实现,省掉大量重复样板代码。
只有当需要自定义字段映射、特殊编解码逻辑的时候,才需要手动声明CodingKeys枚举,比如做蛇形命名到驼峰命名的映射:
// 手动声明CodingKeys后,编译器会直接使用定义的版本,不再自动生成全属性匹配的枚举 enum CodingKeys: String, CodingKey { case name case createdAt = "created_at" case updatedAt = "updated_at" case githubId = "github_id" }
内容的提问来源于stack exchange,提问作者Sunxb
相关产品推荐
相关产品推荐

