如果你是一名有一定开发经验的开发者,那么你就一定会遇到过数据解析的问题。 最常见的就是 JSON 数据的解析,你的 APP 总会要请求一些服务器数据,比如各种信息列表,配置数据等。
如果你之前用过 Objective-C
的话, 那么你一定对 NSJSONSerialization
并不陌生。 它的总体步骤大致是这样,先从 Data
对象中解析出 NSDictionary
或 NSArray
, 然后在从这里面按照属性名称取出需要的值,最后再用这些值给实体对象赋值。
总体来说这个操作并不轻松,而且比较容易出差错,比如你在写解析代码的时候把属性名写错了,或者某个 nil
判断没有处理正确,导致了程序意外崩溃,就需要花不少时间进行调试。
我们的主题自然不是 NSJSONSerialization
, 而是 Swift 中提供的 Codable
协议。 它和前者有着相似的作用,但应用范围更广,并且易用性更好。 先来看一下 Codable
协议的定义:
它其实另外两个 Protocol
的集合,也就是 Decodable
和 Encodable
。 一个用作数据解析,另一个用作数据编码。 其他不多说,咱们先来看一个实例,我们先声明一个实体类 Person
它声明实现了 Codable
:
var name: String
var gender: String
var age: Int
}
除了声明 Codable
之外,这个实体类并没有其他代码,只有几个属性声明。 如果我们需要把他的实例编码成 JSON 字符串,可以这样:
let encoder = JSONEncoder()
let data = try! encoder.encode(person)
let encodedString = String(data: data, encoding: .utf8)!
print(encodedString) // 输出 { "name": "swift", "age": 24, "gender": "male"}
如上所示,首先初始化了一个 Person
实例。 然后初始化了一个 JSONEncoder
。 再调用它的