用途
Codable Patterns 是一份针对 Swift 6.2 / iOS 26+ 的编解码实践参考,目标是使用 Codable(Encodable 与 Decodable)配合 JSONEncoder、JSONDecoder 及相关 API,在 Swift 类型与 JSON、属性列表(property list)和其他外部表示之间完成编码与解码。
主要能力与内容
基础一致性:当所有存储属性本身都是 Codable 时,编译器会自动合成一致性。建议只读 API 响应使用 Decodable,只写场景使用 Encodable,仅在双向都需要时使用 Codable。
自定义 CodingKeys:通过声明 CodingKeys 枚举重命名 JSON 键,无需编写自定义解码器。注意每个存储属性都必须出现在该枚举中,从枚举中省略某属性会将其排除在编解码之外。
自定义编解码:当前合成一致性无法处理的转换,可覆盖 init(from:) 与 encode(to:),示例中演示了将 Unix 时间戳(Double)转换为 Date、以及缺失键时默认使用空数组。
嵌套与扁平化容器:使用 nestedContainer(keyedBy:forKey:) 遍历并扁平化嵌套 JSON,可用 nestedUnkeyedContainer(forKey:) 处理嵌套数组,并可链式调用以处理深层结构。
异构数组:通过判别字段(discriminator,如 type)解码混合类型数组(示例为文本与图片块的枚举)。
日期解码策略:JSONDecoder.dateDecodingStrategy 支持 .iso8601、.secondsSince1970、.formatted(自定义 DateFormatter,示例使用 yyyy-MM-dd、en_US_POSIX、GMT 时区)以及 .custom 闭包处理多格式。JSONEncoder 需设置匹配的 dateEncodingStrategy。
Data 与键策略:dataDecodingStrategy = .base64 处理 Base64 编码的 Data 字段;keyDecodingStrategy = .convertFromSnakeCase 可将 snake_case 映射为 camelCase(如 user_name 映射到 userName),从而无需 CodingKeys。编码器对应使用 dataEncodingStrategy 与 keyEncodingStrategy。
容错数组解码:默认一个无效元素会导致整个数组解码失败;资料给出 LossyArray 包装类型示例,通过逐元素 try? 解码跳过无效元素,并用一个私有 AnyCodableValue 类型推进过坏元素。
单值容器:使用 singleValueContainer() 包装基本类型以获得类型安全(示例为 UserID,可直接从字符串 JSON 解码)。
缺失键默认值:使用 decodeIfPresent 配合 nil 合并运算符提供默认值(示例 Settings 中 theme 默认 "system"、fontSize 默认 16、notificationsEnabled 默认 true)。
编码器与解码器配置:JSONEncoder 的 outputFormatting 支持 .prettyPrinted、.sortedKeys、.withoutEscapingSlashes;nonConformingFloatEncodingStrategy / nonConformingFloatDecodingStrategy 可处理 NaN、Infinity 等非合规浮点(JSON 本身不允许)。还介绍了 PropertyListEncoder / PropertyListDecoder,输出格式可选 .xml 或 .binary。
与 URLSession 配合:示例展示异步抓取后校验 HTTPURLResponse 状态码(200...299)再交给配置好的解码器,并给出泛型 API 信封 APIResponse<T> 处理包装响应。
与 SwiftData 配合:Codable 结构体可作为 SwiftData 模型的复合属性;资料称 iOS 18+ 起 SwiftData 原生支持,无需显式 @Attribute(.transformable)。
与 UserDefaults 配合:通过让 Codable 类型符合 RawRepresentable,即可用 @AppStorage 存储(示例 UserPreferences 以 JSON 字符串作为 rawValue)。
使用方式
该资料本身以用法范例与注意事项形式组织,包含大量可直接参考的代码片段,覆盖从基础一致性到与框架集成的完整路径。
适用场景
适用于需要处理 API 返回 JSON 的 iOS / Swift 项目,尤其是涉及日期格式、键名风格转换、嵌套结构、混合类型数组、接口容错以及本地持久化(UserDefaults、SwiftData、plist)的编解码场景。
限制
资料标明目标平台为 Swift 6.2 / iOS 26+。文档中列出的 Common Mistakes(如未处理缺失可选键、单个坏元素导致整个数组失败、日期策略不匹配、强制解包、不必要的 Codable、为简单 snake_case API 手写 CodingKeys)与 Review Checklist 属于最佳实践建议。关于该资料的安装方式、收费模式、运行方式或版本发布信息,暂未提供。