Swift数据解析(第四篇) – SmartCodable(上)

这是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的缺陷。