从NSCoding迁移到Codable

对于迟到的用户:Apple 在Swift 4中 引入了 Codable 协议,该协议使您可以将模型类型编码和解码为JSON和属性列表等数据类型,并且可以用来代替 NSCoding 协议来存档数据。

首先,此Codable协议有什么Codable ? 当我们已经有了NSCoding时,学习一种新方法真的值得付出努力吗,这种NSCoding多年来一直可以很好地归档数据? 而且,如果您查看同时实现这两种类型的类型,则它们非常相似。

假设我们有一个Product类型,其中包含标题,价格和数量:

所以-如果它们是如此相似,何必呢?

好吧,有几个很好的理由:

  • 您可能已经注意到, Codable示例中的Product类型是结构而不是类-不必一定是,这只是因为实现Codable协议的类型不需要子类化(提醒NSCoding类型必须是NSObject子类,因此必须是一个类),它们可以自由地为任何类型-类,结构甚至枚举。 动力!
  • 尽管在本文中我主要关注归档到磁盘,但是Codable协议不仅对归档有用,而且对将数据编码或解码为不同的数据类型也很有用。 在撰写本文时,其中包括JSON和属性列表。
  • 如果您只想编码或解码(例如,您可能只是从远程API接收和解码数据),则可以简单地采用EncodableDecodable协议。
  • 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崩溃 。 对于您的忠实用户而言,这是一场灾难!

一种解决方案是同时采用CodableNSCoding协议。 旧用户第一次使用该应用程序时,将使用NSCoding协议检索数据。 他们随后保存数据的任何时间,他们都将使用Codable协议进行保存,并且此后将仅通过Codable协议访问其数据。 在不远的将来,您可以决定不再支持使用NSCoding存储的数据。

同时采用NSCodingCodable协议非常简单。 您已经采用`NSCoding`的模型类型只需要也采用Codable 。 通过自动合成Codable方法,只需更改类头即可:(假设模型类型没有需要手动编写Codable方法的更复杂的结构)

 类别产品:NSObject,Codable,NSCoding { 

如果存储的数据是旧数据,则检索数据现在不应再崩溃,因为您的Codable类型还实现了NSCodingCodable NSObject子类。

您只需更新retrieveProducts方法来处理数据,而不管它是使用NSCoding还是Codable编码的:

由于我们将以Codable格式存储数据,而不管我们如何检索数据,因此存储功能不应与存储Codable数据时的存储功能Codable

而已! 现在,您的应用程序应迁移为使用Codable ,并处理所有旧版NSCoding数据。 下次用户保存数据时,他们将其保存为Codable格式。

本文是作者博客的转载 如果您想了解更多,请下载免费的 iOS开发 第一章 Swift ,并查看此 Slideshare演示 以获取折扣代码。