添加了自定义框架,现在 Swift 无法取消归档数据

Added a custom framework, now Swift can't unarchive data

我有一个非常简单的 Swift 应用程序,它有一个名为 DemoNote 的模型 class。 DemoNote 个实例的数组是 read/written 通过键控归档。当 DemoNote 包含在应用程序中时,这工作正常。

但后来我将 DemoNote.swift 移动到一个名为 DemoSharedCode 的新自定义框架。除了确保 Xcode 在应用程序目标中使用框架外,我还确保

所以现在 编译器 很高兴。但是在 运行 时间解压缩失败并出现此错误:

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 是 class 名称,代码行试图从 NSData 中取消归档对象斑点:

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

我猜将 DemoNote 移动到框架意味着它的模块名称已更改,这会破坏取消存档,但我不确定。我也不确定该怎么做——也许我需要在解压器上调用 +setClass:forClassName:,但如果是这样,我不知道参数是什么。

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

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

在这种情况下,DemoNote.self 获取当前完整的 class 名称,而 DemoNotesSwift.DemoNote 是 class 作为应用程序一部分时的名称.

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