Swift语言Codable 用法及原理详解
什么是Codable
Codable
是Swift4引入的一个协议,用于将Swift对象与外部数据格式(如JSON)进行相互转换。通过实现Codable
协议,我们可以将一个包含各种类型属性的对象编码成JSON字符串或从JSON字符串中解码成Swift对象。通过Codable
,我们可以更方便安全地处理数据。
Codable主要包含两个协议
Codable协议是一个复合协议,内容为Encodable和Decodable两个协议,并提供默认的实现,其中Encodable
用于编码将值编码到外部表示中,Decodable
从外部表示中解码数据生成值。
public typealias Codable = Encodable & Decodable
Codable的使用
我们只需要在swift类中实现Codable协议即可让它支持从JSON中解析和编码成JSON。示例如下:
struct MyModel: Codable {
var name: String
var age: Int
var email: String
}
我们在结构体(或类)前添加了Codable
协议,在该结构体(或类中)定义了几个属性。这些属性将自动遵循Codable
协议。这样我们就能够方便地编码和解码MyModel
对象了。下面演示一下具体的使用方法。
使用示例
编码成JSON字符串
let myModel = MyModel(name: "Swift", age: 4, email: "swift@swift.com")
let jsonData = try JSONEncoder().encode(myModel)
let jsonString = String(data: jsonData, encoding: .utf8)!
print(jsonString)
这里我们新建了一个MyModel
对象,并且使用JSONEncoder()
将其编码成一个JSON字符串。最终输出的字符串应为:
{"name":"Swift","age":4,"email":"swift@swift.com"}
从JSON字符串解码
let jsonString = "{\"name\":\"Swift\",\"age\":4,\"email\":\"swift@swift.com\"}"
let jsonData = jsonString.data(using: .utf8)!
let myModel = try JSONDecoder().decode(MyModel.self, from: jsonData)
我们将JSON字符串转换成对应的Data类型,然后使用JSONDecoder()
将其解码成一个MyModel
对象。这里一定要指定要解码的是哪种类型的对象,即调用decode(_:from:)
方法时指定类型MyModel.self
。
注意事项
自定义Key
如果你的对象属性名与JSON字符串中的Key不匹配,那么可以在属性前面加一个CodingKeys
枚举,用来定义属性名与JSON字符串Key的对应关系。
struct MyModel: Codable {
var name: String
var age: Int
var email: String
enum CodingKeys: String, CodingKey {
case name = "my_name"
case age = "my_age"
case email = "my_email"
}
}
自定义解码与编码
如果你需要现有的解码和编码机制做出一些更改,你可以实现Decodable
和Encodable
协议的方法来进行具体的操作。
struct MyModel: Codable {
var name: String
var age: Int
var email: String
enum CodingKeys: String, CodingKey {
case name = "my_name"
case age = "my_age"
case email = "my_email"
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
name = try container.decode(String.self, forKey: .name)
age = try container.decode(Int.self, forKey: .age)
email = try container.decode(String.self, forKey: .email)
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(name, forKey: .name)
try container.encode(age, forKey: .age)
try container.encode(email, forKey: .email)
}
}
在定义CodingKeys
枚举之外还自定义了init(from:)
和encode(to:)
方法,并在这两个方法中手动实现了解码和编码的过程。
总结
Codable
是Swift4中我们用来把数据转化成 JSON 与将 JSON 数据解析成对象的一种新的方式。通过实现Codable
协议,我们可以更方便地进行数据的编码和解码,并且不需要基础过于高深的网络基础知识。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:swift语言Codable 用法及原理详解 - Python技术站