Swift中Decodable的CodingKeys除重命名外还有哪些使用场景?
无自定义属性名需求时,手写全量同名CodingKeys和自动合成的实现有差异吗?
没有功能层面的差异。Swift 编译器会为遵从Decodable/Encodable协议的结构体自动生成CodingKeys枚举,枚举的 case 和所有存储属性同名,RawValue 就是属性名字符串本身。你手写的全量同名枚举和编译器自动生成的逻辑完全一致,解码行为、运行性能都没有区别。
额外提醒:你给出的示例代码存在语法笔误,
let age: Int: String是非法写法,应该修正为let age: Int。
除了属性重命名外,还有哪些场景必须使用CodingKeys?
- 忽略不需要参与编解码的属性:如果你的结构体有部分存储属性是本地计算/赋值的,不需要从JSON解析,也不需要序列化输出,只要在
CodingKeys里排除对应的case即可,编译器不会为排除的属性生成编解码逻辑,也不会因为JSON缺失对应key报错。如果不手写CodingKeys,编译器会默认把所有存储属性都纳入编解码范围,多余的本地属性会直接导致解码失败。 - 自定义编解码逻辑的前置要求:只要你需要重写
init(from decoder: Decoder) throws自定义解码逻辑,或者重写encode(to encoder: Encoder) throws自定义编码逻辑,就必须手写CodingKeys枚举指定你要操作的key,无法依赖编译器自动合成的枚举。 - 扁平化解析嵌套JSON结构:如果JSON层级嵌套较深,你不想逐层定义嵌套结构体,可以手写
CodingKeys配合nestedContainer(keyedBy:forKey:)方法直接提取深层字段,把嵌套数据扁平化解析到当前结构体的属性上,减少冗余的结构体定义。 - 自定义字段解析逻辑:比如你需要判断某个key是否存在来决定赋值逻辑(不存在就给默认值而非抛出错误)、或者需要按自定义顺序处理字段,都需要手写
CodingKeys来实现。
内容的提问来源于stack exchange,提问作者mendokusai
相关产品推荐
相关产品推荐

