You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 22:39:26