Swift是否有更简洁的CodingKeys声明方式?
Swift Codable 字段映射精简方案
现有稳定版本可用的优化方案
你不需要为每个属性手动编写自定义映射值,通过系统内置能力就能大幅减少重复代码:
- 解码时给
JSONDecoder设置keyDecodingStrategy = .convertFromSnakeCase,开启全局蛇形命名自动转驼峰逻辑,所有符合蛇形命名规则的响应字段(比如credit_score、status_code)会自动匹配对应驼峰命名的属性,不需要额外写映射规则。 - 编写CodingKeys枚举时,仅需要给5-7个命名不规范的特殊字段指定自定义的响应键名,其余常规字段只需要声明和属性名一致的case即可,不需要手动编写rawValue映射,解码器会自动基于蛇形转驼峰规则完成匹配。
手动编写的示例代码如下:
let decoder = JSONDecoder() decoder.keyDecodingStrategy = .convertFromSnakeCase struct MyStruct: Codable { let aUserName: String let creditScore: Int let statusCode: Int // 剩余47个常规属性正常声明即可 private enum CodingKeys: String, CodingKey { // 仅特殊字段需要自定义映射值 case aUserName = "AUsernAme" case bTMember = "_BTmember" // 其余常规字段只需要列case名,无需写映射值 case creditScore case statusCode // ... 剩余常规case } }
如果想要完全省去手写CodingKeys枚举的步骤,直接实现你预期的属性级注解映射效果,在Swift 5.9及以上版本可以通过自定义编译宏实现:给需要特殊映射的属性加上@CodingKey("响应键名")标记,宏会在编译期自动生成全量的CodingKeys枚举代码,自动给特殊字段加上自定义映射,常规字段自动生成对应case,全程不需要手动编写任何CodingKeys相关代码,最终写法和你给出的示例完全一致。
官方内置特性规划
目前所有已发布的Swift稳定版本,都没有内置@CodingKey这类属性级映射注解。Swift社区演进流程中已经有多个相关提案,核心方向就是减少Codable场景下的样板代码,属性级自定义映射是重点讨论的需求之一,但截至目前没有已经通过审核的正式提案确定该特性的具体上线版本,后续Swift版本大概率会推出官方实现,但暂时没有明确的发布时间表。
内容的提问来源于stack exchange,提问作者Anthony
相关产品推荐
相关产品推荐

