遵循 Codable
让类型自动具备编码和解码能力。
遵循 Codable 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。
什么是 Codable
Codable 是 Encodable & Decodable 的类型别名。类型遵循它后,Swift 就可以将实例转换为外部数据(例如 JSON),并再次从数据中重建实例——无需手动编写解析代码。
import Foundation
struct Book: Codable {
var title: String
var pages: Int
}
print("Book conforms to Codable")自动合成
如果每个存储属性本身都符合 Codable,编译器就会为您自动合成编码和解码逻辑。您只需编写属性列表,其余部分由 Swift 完成。
import Foundation
struct User: Codable {
var name: String
var age: Int
var isActive: Bool
}
let u = User(name: "Ada", age: 36, isActive: true)
print(u)编码为 JSON 数据
符合 Codable 的值可以交给 JSONEncoder,它会生成一段 Data 数据。将这段 Data 转换为 String,即可查看 JSON 文本。
import Foundation
struct User: Codable {
var name: String
var age: Int
}
let u = User(name: "Ada", age: 36)
let data = try JSONEncoder().encode(u)
print(String(data: data, encoding: .utf8)!)从 JSON 数据解码
反向过程使用 JSONDecoder。向它提供目标类型和原始 Data,它就会重建出一个类型完整的 Swift 值。
import Foundation
struct User: Codable {
var name: String
var age: Int
}
let json = "{\"name\":\"Ada\",\"age\":36}"
let data = json.data(using: .utf8)!
let u = try JSONDecoder().decode(User.self, from: data)
print(u.name, u.age)值的往返转换
先编码再解码后,应当得到一个相等的值。这种往返转换是快速确认某个类型的 Codable 一致性是否按预期工作的方法。
import Foundation
struct Point: Codable {
var x: Int
var y: Int
}
let p = Point(x: 3, y: 7)
let data = try JSONEncoder().encode(p)
let back = try JSONDecoder().decode(Point.self, from: data)
print(back.x, back.y)仅支持编码
您可以只符合其中一部分。Encodable 表示某个类型可以被写出,但不能被读回;对于从不需要解析的响应模型,这非常实用。
import Foundation
struct Receipt: Encodable {
var item: String
var total: Double
}
let r = Receipt(item: "Coffee", total: 4.5)
let data = try JSONEncoder().encode(r)
print(String(data: data, encoding: .utf8)!)仅支持解码
同样,Decodable 允许从外部数据构建某个类型,但不能将其编码。对于只读取和使用的只读 API 数据,这很有用。
import Foundation
struct Config: Decodable {
var version: Int
var debug: Bool
}
let json = "{\"version\":2,\"debug\":true}"
let data = json.data(using: .utf8)!
let c = try JSONDecoder().decode(Config.self, from: data)
print(c.version, c.debug)支持的属性类型
标准库类型(例如 String、Int、Double、Bool、Date、Data 和 URL),以及由 Codable 元素组成的数组和字典,开箱即用地都符合 Codable。
import Foundation
struct Profile: Codable {
var name: String
var tags: [String]
var scores: [String: Int]
}
let p = Profile(name: "Sam", tags: ["a", "b"], scores: ["math": 90])
let data = try JSONEncoder().encode(p)
print(String(data: data, encoding: .utf8)!)枚举也可以符合协议
带有原始值(例如 String 或 Int)的枚举会自动符合 Codable。它在 JSON 中会编码为自己的原始值。
import Foundation
enum Status: String, Codable {
case active, paused, done
}
struct Task: Codable {
var title: String
var status: Status
}
let t = Task(title: "Ship", status: .active)
let data = try JSONEncoder().encode(t)
print(String(data: data, encoding: .utf8)!)属性必须符合 Codable
只有在所有存储属性都符合 Codable 时,自动合成才会生效。如果属性使用了自定义类型,该类型也必须符合协议;否则编译器会拒绝进行合成。
import Foundation
struct Address: Codable {
var city: String
}
struct Person: Codable {
var name: String
var address: Address
}
let p = Person(name: "Lee", address: Address(city: "Rome"))
print(try JSONEncoder().encode(p).count, "bytes")Codable 的重要性
Codable 消除了手写序列化样板代码,让类型本身成为唯一事实来源,并能在编译时发现不匹配。它是 Swift 应用在数据内外传递时采用的标准方式。
import Foundation
struct Settings: Codable {
var theme: String
var fontSize: Int
}
let s = Settings(theme: "dark", fontSize: 14)
let data = try JSONEncoder().encode(s)
let back = try JSONDecoder().decode(Settings.self, from: data)
print(back.theme, back.fontSize)快速检查:符合 Codable
测试您对协议一致性的理解。
回顾:符合 Codable
您已经学习了 Swift 序列化的基础:
Codable=Encodable & Decodable。- 当所有属性都符合
Codable时,一致性会被自动合成。 JSONEncoder生成Data;JSONDecoder重建值。- 标准类型、原始值枚举以及嵌套的
Codable类型都受到支持。
常见问题解答
「遵循 Codable」课时是免费的吗?
是的 — 「遵循 Codable」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。
「遵循 Codable」这节课中我会学到什么?
让类型自动具备编码和解码能力。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Swift Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「遵循 Codable」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Swift Academy 课中编写并运行代码吗?
能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。