序列化自定义词典


更新:新的Swift 4过度简化了此过程, 请查看如何


通过Swift 字典NSDictionary编码之间的自动桥接,更常见的String到Object字典非常简单。 但是,当我们想使用任意对象作为键时,情况会发生变化。

常规词典仅对键类型强制实施可哈希等价协议。 如果我们要构建持久性类,则可以从NSObject继承这些属性。 另外,我们需要实现NSCoding进行序列化。

 类项目:NSObject,NSCoding {...}各种数量:[Item:Int] 

使用NSKeyedArchiver保存该对象的方式应为:

 让_ = NSKeyedArchiver.archiveRootObject(self,toFile:file) 

但是,当尝试还原实例时,会发生一个模糊的错误:

 让restore = NSKeyedUnarchiver.unarchiveObject(withFile:file) //例外:[MyClassName copyWithZone:]无法识别的选择器发送到实例 

事实证明,由于某种原因,NSDictionary还要求密钥类型符合NSCopying。 一个简单的实现可以解决:

 类项目:NSObject,NSCoding,NSCopying {
      func copy(with zone:NSZone?= nil)->任何{
        返回项目(名称:名称,库存:库存)
      }
 ... 

这是一个完整的工作示例: