7

我有一个非常简单的 Swift 应用程序,它有一个名为DemoNote. DemoNote通过键控归档读取/写入实例数组。DemoNote这在包含在应用程序中时效果很好。

但后来我转向DemoNote.swift了一个新的自定义框架,称为DemoSharedCode. 除了确保 Xcode 在应用程序目标中使用框架之外,我还确保

  • 标记DemoNote及其变量和方法,public以便它们在框架之外可见
  • 添加import DemoSharedCode到任何想要使用的类DemoNote

所以现在编译器很高兴。但在运行时,取消归档失败并出现以下错误:

2015-02-17 12:12:53.417 DemoNotesSwift[70800:16504104] *** Terminating app due to 
uncaught exception 'NSInvalidUnarchiveOperationException', reason:
'*** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class
(DemoNotesSwift.DemoNote)'

在上面,DemoNotesSwift是应用程序名称,DemoNote是类名称,并且代码行正在尝试从NSDatablob 中取消归档对象:

let savedObjects = NSKeyedUnarchiver.unarchiveObjectWithData(savedData) as? [(DemoNote)]

我猜移动DemoNote到框架意味着它的模块名称已经改变,这会破坏取消归档,但我不确定。我也不知道该怎么办——也许我需要调用+setClass:forClassName:unarchiver,但如果是这样,我不知道参数会是什么。

4

1 回答 1

18

DemoNote应用程序迁移到框架确实更改了模块名称,这意味着NSKeyedUnarchiver由于名称不匹配而无法找到存档类的实例。解决方法是在取消归档之前添加这一行:

NSKeyedUnarchiver.setClass(DemoNote.self, forClassName: "DemoNotesSwift.DemoNote")

在这种情况下,DemoNote.self获取当前的完整类名,以及DemoNotesSwift.DemoNote当它是应用程序的一部分时该类曾经被调用的名称。

这只是必要的,因为我以前有想要保留的数据。

于 2015-02-18T19:17:13.417 回答