这是Swift数据解析计划的系列文章:
Swift数据解析(第一篇) – 技能选型
Swift数据解析(第二篇) – Codable 上
Swift数据解析(第二篇) – Codable 下
Swift数据解析(第三篇) – Codable源码学习
Swift数据解析(第四篇) – SmartCodable 上
Swift数据解析(第四篇) – SmartCodable 下
优异的数据解析库是什么样的?
- 运用安全:不要呈现crash,
- 容错状况:遇到反常的数据可以兼容掉,兼容全场景。
- 执行功率:执行功率高。
- 运用方便:结构接口运用简单,代码量越少越好。
- 学习成本:学习成本低,上手简单。
通过前面几篇的学习,咱们对Codable有了深化的了解。咱们来评判一下Codable契合哪条,不契合哪条。
Codable的缺陷
缺陷1: 兼容性差
运用Codable协议 进行decode时候,遇到以下三种状况就会失败。而且只有一个属性解析失败时就抛出反常,导致整个解析失败:
- 类型键不存在
- 类型键不匹配
- 数据值是null
希望遇到反常的数据,Codable可以测验兼容,尽可能的防止扫除解析反常,防止整段解析失败,完成解析。
类型键不存在
填充对应类型的默认值,让解析继续进行下去。 咱们需求开发一个功用,通过获取键的类型,回来对应的默认值。 例如:Bool类型的默认值回来False,Int类型的默认值回来, 可选类型的默认值回来nil。
类型键不匹配
类型键不匹配的兼容较为复杂。如果咱们的模型中定义的属性类型是Bool,可是数据回来的是Int类型的0或1,或String类型的“false”,“true”等。尽管类型不匹配,可是数据仍然是有价值的。所以第一步咱们需求做的是: 测验对不匹配的类型数据进行转化。如果转化失败,再提供对应类型的默认值。
数据值是null
运用对应的默认值进行填充。
缺陷2: 运用不便
struct Feed: Codable {
var name: String
var id: Int
}
let dict = [
"id": 2,
"name": "小明",
] as [String : Any]
let jsonStr = dict.bt_toJSONString() ?? ""
guard let jsonData = jsonStr.data(using: .utf8) else { return }
let decoder = JSONDecoder()
do {
let feed = try decoder.decode(Feed.self, from: jsonData)
print(feed)
} catch let error {
print(error)
}
-
数据类型转化太多,先将字典转成Json字符串,再将Json字符串转Data。
-
需求调用do-catch,代码完成上不便。
SmartCodable
SmartCodable 便是针对Codable的缺陷,进行了一次封装。保留了Codable优势的一起,也解决了Codable的缺陷。