我有一个非常简单的 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
是类名称,这行代码试图从 NSData< 中解压对象
Blob :
let savedObjects = NSKeyedUnarchiver.unarchiveObjectWithData(savedData) as? [(DemoNote)]
我猜测将 DemoNote
移动到框架意味着它的模块名称已更改,这会破坏解压缩,但我不确定。我也不确定该怎么做——也许我需要在 unarchiver 上调用 +setClass:forClassName:
,但如果是这样,我不知道参数是什么。
最佳答案
将 DemoNote
从应用程序移动到框架确实更改了模块名称,这意味着 NSKeyedUnarchiver
由于名称不匹配而无法找到存档类的实例。解决方法是在取消存档之前添加此行:
NSKeyedUnarchiver.setClass(DemoNote.self, forClassName: "DemoNotesSwift.DemoNote")
在这种情况下,DemoNote.self
获取当前的完整类名,DemoNotesSwift.DemoNote
是该类作为应用程序的一部分时被调用的名称.
这只是必要的,因为我想保留以前存在的数据。
关于ios - 添加了自定义框架,现在 Swift 无法解压数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28569468/