从NSCoding迁移到Codable
对于迟到的用户:Apple 在Swift 4中 引入了 Codable
协议,该协议使您可以将模型类型编码和解码为JSON和属性列表等数据类型,并且可以用来代替 NSCoding
协议来存档数据。
首先,此Codable
协议有什么Codable
? 当我们已经有了NSCoding
时,学习一种新方法真的值得付出努力吗,这种NSCoding
多年来一直可以很好地归档数据? 而且,如果您查看同时实现这两种类型的类型,则它们非常相似。
假设我们有一个Product
类型,其中包含标题,价格和数量:
所以-如果它们是如此相似,何必呢?
好吧,有几个很好的理由:
- 您可能已经注意到,
Codable
示例中的Product
类型是结构而不是类-不必一定是,这只是因为实现Codable
协议的类型不需要子类化(提醒NSCoding
类型必须是NSObject
子类,因此必须是一个类),它们可以自由地为任何类型-类,结构甚至枚举。 动力! - 尽管在本文中我主要关注归档到磁盘,但是
Codable
协议不仅对归档有用,而且对将数据编码或解码为不同的数据类型也很有用。 在撰写本文时,其中包括JSON和属性列表。 - 如果您只想编码或解码(例如,您可能只是从远程API接收和解码数据),则可以简单地采用
Encodable
或Decodable
协议。 -
Codable
任何具有Codable
经验的Codable
都可能会在屏幕上大喊大叫! 因此……可Codable
协议的Codable
在于它具有自动生成其所需方法(编码和初始化)和CodingKeys
枚举的能力。 如果您对类型中的Codable
属性进行了简单的编码/解码,Codable
可以将其省略,并允许编译器自动生成它们,哇!
自动生成很棒,但是在某些情况下,您将需要放弃自动生成的便利,而手动组合其中的一个或全部。 例如:
- 类型的一个或多个属性可能不是
Codable
。 在这种情况下,您需要将其与Codable
类型相互转换。 - 类型的结构可能与您要编码/解码的结构不同。
- 您可能需要编码和解码不同于类型属性的属性。
- 您可能要对类型的属性使用不同的名称。
我们已经看到了如何定义模型类型进行比较,但是实际数据归档如何进行比较?
这是使用NSCoding
归档和取消归档Product
类的数据:
这是由于两个因素:
- 编码和解码可能会在
Codable
协议中引发错误。 这是一件好事–这意味着您的应用在使用Codable
协议进行编码和解码时不太可能崩溃。 - 在将数据类型传递到存档之前,您需要手动请求使用自定义编码器对数据类型进行编码。 (对于解码和取消存档也可以相反。)
因此,您可以看到实现Codable
协议与NSCoding
协议Codable
具有其优势。 问题是–我们该如何处理使用NSCoding
旧项目?
好吧,当然,我们无能为力。 Apple尚未宣布他们不赞成使用NSCoding
,因此您应该继续使用它。
但是,如果您希望将代码更新为更现代的Codable
协议,该如何……?
如果仅将NSCoding
类型切换为Codable
类型,然后在具有预先存在的NSCoding
数据的设备上运行该应用程序,则该应用程序尝试将其归档为Codable
数据时,不仅会失败 ,还会因Codable
而崩溃 。 对于您的忠实用户而言,这是一场灾难!
一种解决方案是同时采用Codable
和NSCoding
协议。 旧用户第一次使用该应用程序时,将使用NSCoding
协议检索数据。 他们随后保存数据的任何时间,他们都将使用Codable
协议进行保存,并且此后将仅通过Codable
协议访问其数据。 在不远的将来,您可以决定不再支持使用NSCoding
存储的数据。
同时采用NSCoding
和Codable
协议非常简单。 您已经采用`NSCoding`的模型类型只需要也采用Codable
。 通过自动合成Codable
方法,只需更改类头即可:(假设模型类型没有需要手动编写Codable
方法的更复杂的结构)
类别产品:NSObject,Codable,NSCoding {
如果存储的数据是旧数据,则检索数据现在不应再崩溃,因为您的Codable
类型还实现了NSCoding
并Codable
NSObject
子类。
您只需更新retrieveProducts
方法来处理数据,而不管它是使用NSCoding
还是Codable
编码的:
由于我们将以Codable
格式存储数据,而不管我们如何检索数据,因此存储功能不应与存储Codable
数据时的存储功能Codable
。
而已! 现在,您的应用程序应迁移为使用Codable
,并处理所有旧版NSCoding
数据。 下次用户保存数据时,他们将其保存为Codable
格式。
本文是作者博客的转载 。 如果您想了解更多,请下载免费的 iOS开发 第一章 Swift ,并查看此 Slideshare演示 以获取折扣代码。