用途:这是一份 Swift Codable 协议实践指南,面向 Swift 6.x,用于处理 JSON 与 PropertyList 的编码和解码,帮助在类型与外部数据格式之间建立映射。
主要能力:
- 自动合成:当所有存储属性均为 Codable 时,仅需添加
: Codable即可自动合成;涵盖结构体与枚举(原始值枚举、无关联值枚举、带关联值枚举)的合成规则。 - CodingKeys 定制:重命名键、排除属性(被排除属性需有默认值)、配合
.convertFromSnakeCase做蛇形转驼峰,以及用{CaseName}CodingKeys定制枚举关联值的键名。 - 手动实现:当 JSON 与模型结构不一致时,实现
init(from:)与encode(to:),使用 Keyed、Unkeyed、Single-value、Nested 容器,或用桥接类型处理结构性差异。 - 日期处理:内置
.iso8601、.secondsSince1970、.millisecondsSince1970、.formatted与.custom策略;自定义 DateFormatter 需设置 locale 与 timeZone。 - 类型转换:StringBacked 包装器处理数字以字符串返回的 API,以及宽松类型强制转换。
- 进阶模式:DecodableWithConfiguration(iOS 15+)注入 JSON 中不存在的数据、部分解码、userInfo 兼容方案。
- 调试:区分 keyNotFound、typeMismatch、valueNotFound、dataCorrupted 等 DecodingError,并用 prettyPrinted、codingPath、JSONSerialization 辅助排查。
使用方式:按决策树选择方案——属性全为 Codable 用自动合成;键名不一致或需排除属性用 CodingKeys;枚举带关联值注意为关联值加标签,否则会生成 _0、_1 键;结构差异大用桥接类型;需要外部数据用 DecodableWithConfiguration。
适用场景:Swift 项目中的网络响应解析、本地持久化、API 模型映射等。
限制:自动合成对计算属性、非 Codable 属性、属性包装器(如 @Published、@State)和类继承不适用;文档建议避免用 try? 吞掉 DecodingError,避免手工拼接 JSON 字符串,避免用 JSONSerialization 处理 Codable 类型,并强调日期需带时区。具体平台版本与性能细节以官方资料为准。