Swift Codable 完整指南:协议、方法与实战示例
1. 什么是 Codable?为什么需要它?
Codable 是 Swift 语言内置的协议(实际上是 Encodable & Decodable 的类型别名),自 Swift 4 起引入。它提供了一种声明式的方法,用于将自定义数据类型序列化为 JSON、Property List (plist) 等格式,或从这些格式反序列化回来。你不再需要手动编写繁琐的代码来将结构体转换为字典或反之,Codable 会根据模型的属性自动生成编码/解码逻辑。
为什么需要它?在现代 iOS/macOS 开发中,几乎每个应用都需要与服务器 API 交互,以 JSON 格式接收和发送数据。如果没有 Codable,开发者必须手动编写循环、检查类型、处理可选值,并编写反向解析器。Codable 解决了这一问题,使代码更简洁、更安全,并显著缩短开发时间。它也是 Apple 生态系统中处理 JSON 的事实标准。
Codable 基于 Encodable(将 Swift 类型转换为数据)和 Decodable(将数据转换为 Swift 类型)两个协议。将两者结合,即可实现完整的序列化循环。该协议与 JSONEncoder 和 JSONDecoder 紧密集成,它们是处理 JSON 的主要工具。
2. 安装指南
Codable 是 Swift 标准库(Foundation)的一部分。无需任何额外安装。你不需要使用 pip、npm、CocoaPods 或 Swift Package Manager 来引入它。只需在你的文件中导入 Foundation 即可:
import Foundation
如果你在 Linux 环境下使用 Swift(例如通过 Swift Package Manager),Codable 同样开箱即用。对于 Vapor 等服务器端框架,Codable 也是默认使用的。
3. 快速上手——最小工作示例
让我们创建一个简单的用户结构体,并将其序列化/反序列化为 JSON。
import Foundation
// 1. 定义一个遵循 Codable 协议的模型
struct User: Codable {
let id: Int
let name: String
let email: String
}
// 2. 创建一个实例
let user = User(id: 1, name: "Alice", email: "alice@example.com")
// 3. 编码为 JSON
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted // 美化输出
do {
let jsonData = try encoder.encode(user)
if let jsonString = String(data: jsonData, encoding: .utf8) {
print("JSON: \n\(jsonString)")
}
// 4. 解码回 Swift 对象
let decoder = JSONDecoder()
let decodedUser = try decoder.decode(User.self, from: jsonData)
print("解码后的用户: \(decodedUser.name), 邮箱: \(decodedUser.email)")
} catch {
print("错误: \(error)")
}
控制台输出:
JSON:
{
"id" : 1,
"name" : "Alice",
"email" : "alice@example.com"
}
解码后的用户: Alice, 邮箱: alice@example.com
如你所见,仅需几行代码,序列化就完成了。
4. 核心方法/函数/类详解
下面介绍 Codable 中你将经常使用的关键组件。
4.1 JSONEncoder
签名: class JSONEncoder : NSCoder
功能: 将遵循 Encodable 协议的类型的实例转换为 Data 对象(JSON 格式)。
图书馆中也有
推荐