这是Swift数据解析计划的系列文章:
Swift数据解析(第一篇) – 技能选型
Swift数据解析(第二篇) – Codable 上
Swift数据解析(第二篇) – Codable 下
Swift数据解析(第三篇) – Codable源码学习
Swift数据解析(第四篇) – SmartCodable 上
Swift数据解析(第四篇) – SmartCodable 下
数据解析一直是移动端的核心才能,跟咱们的业务严密相关。随着Swift的建设开展,Swift数据解析库的开展进程能够大致分为四个阶段:
- 从OC项目开展过来的Swift,沿用着OC的数据解析计划,比方YYModel。
- Swift4.0之前,官方并没有供给解析计划。一些三方库(HandyJSON,ObjectMapper)大放异彩。
- Swift4.0之后,官方推出Codable协议的数据解析计划。
- Swift 4.0: 在Swift 4.0中,苹果引入了Codable协议。Codable协议是Encodable和Decodable协议的组合,它使得目标的编码和解码变得非常简略。经过遵循Codable协议,开发者能够运用Swift的内置JSONEncoder和JSONDecoder来主动进行目标与JSON之间的转化。
- Swift 4.1: 在Swift 4.1中,苹果对Codable进行了一些改进和优化。它增加了对keyed container的支撑,使得处理复杂的嵌套数据结构愈加便利。
- Swift 5.0: 在Swift 5.0中,苹果对Codable进行了一些性能优化,提高了编码和解码的功率。此外,它还引入了新的编码和解码战略,使开发者能够更好地操控数据。
- Swift 5.1: 在Swift 5.1中,苹果供给了 @propertyWrapper,为数据解析供给了更好的灵活性。
混编OC计划
从OC项目开展过来的Swift,沿用着OC的数据解析计划,比方 JSONModel、MJExtension、YYModel 等。
- 咱们不得不给 Model 添加 @objc 标识,然后运用这些传统的 OC 库来进行转化。无法运用 Swift 中 struct 低内存占用、无内存泄露危险、线程安全、写时仿制等很多特性。
- OC和Swift并不是完全互通的, 这就代表着有必定的差异性。而且OC现已完全停止更新了。Swift的一些新特性并不支撑OC。
- 既然选择OC转Swift,这种常用才能就要考虑后续的迁移价值。混编OC,不是长久之计。
- 混编的编译价值。在OC代码中引用Swift代码时,通常状况下是经过导入 xxx-Swift.h 头文件来完成的,该头文件包含了整个Swift模块的揭露接口和符号的声明,无法选择性地导入部分Swift代码。意味着改动一点Swift代码,就需求全量编译整个Swift模块的揭露接口和符号的声明。
ObjectMapper
手动对每一个目标供给映射联系(映射属性与JSON键之间的联系),代码量较大。
SwiftyJSON
SwiftyJSON更像数据Json化的计划。并没有供给合适的Model化计划。
HandyJSON
HandyJSON因为其快捷的运用,强壮的反常兼容性,是Swift运用最广泛的数据解析库之一。
运用危险1: 官方主张不在运用
HandyJSON issue #447
HandyJSON issue #466
抱愧,现在现已不再主张继续运用。Swift发布4.0版别之前,官方未供给引荐的JSON处理计划,因而咱们规划并完成了HandyJSON这套计划。但现在:1. Swift现已供给了Codable机制,能够相对快捷的进行JSON处理;2. HandyJSON的完成强依靠于Swift底层内存布局机制,这个机制对错揭露、不被许诺、且实践证明一直在随着Swift版别变动的,HandyJSON需求跟进Swift的每次版别更新,更大的危险是,用户晋级iOS版别可能会影响这个依靠,导致应用逻辑反常。
综上,咱们不再主张继续运用。
运用危险2: 不稳定性
但是HandyJSON 是运用的反射机制完成的。反射机制的库Reflection现已被标记为抛弃了。强依靠Swift底层内存布局机制(不被许诺,非揭露的),HandyJSON需求跟进Swift的每次版别更新,更大的危险是,用户晋级iOS版别可能会影响这个依靠,导致应用逻辑反常。
Reflection 源码说明
reflection-deprecated
根据Swift官方文档,自Swift 5.1起,Reflection(反射)已被标记为抛弃。这意味着在最新的Swift版别中,不再主张运用Reflection来进行目标的反射操作。
然而,Mirror(镜像)依然能够运用,而且是Swift标准库的一部分。虽然Reflection被抛弃,但Mirror依然供给了一种访问和操作目标的结构化方式。因而,您依然能够运用Mirror来获取目标的类型信息、属性和值等。
请注意,因为Reflection已被抛弃,未来的Swift版别可能会进一步削减或移除对Mirror的支撑。因而,在运用Mirror时,主张亲近关注Swift的更新和变化,以确保您的代码与最新的Swift版别兼容。
Codable的三方库
调研了Star前几名的Codable三方库,都有不如意的地方。
三方库 | Star | 长处 | 缺陷 |
---|---|---|---|
BetterCodable | 1.6K | 能够兼容类型不一致的状况,运用属性包装器完成,运用较为便利。 | 无法兼容缺失字段的状况。数据少了字段,就会整段解析失败。 |
Codextended | 1.5K | 对Codable协议的扩展增强,极大的简化了运用codable的代码量。 | 并没有改变每个Model都需求反常处理的状况。 |
AnyCodable | 1.2K | 对数据层处理,兼容了字典和Json之间的无障碍转化 | 并没有形成完整的数据解析结构。 |
SmartCodable
咱们决议自己测验写一套基于Codable的Swift数据解析结构,并遵循 安全,便利运用,低学习本钱的原则。
咱们写了很多demo,具体学习了Codable相关的API。 规划了很多场景,搜集Codable的表现。 研读源码,了解完本钱质。
做完这些之后,开发了SmartCodable。