添加了自定义框架,现在 Swift 无法取消归档数据
Added a custom framework, now Swift can't unarchive data
我有一个非常简单的 Swift 应用程序,它有一个名为 DemoNote
的模型 class。 DemoNote
个实例的数组是 read/written 通过键控归档。当 DemoNote
包含在应用程序中时,这工作正常。
但后来我将 DemoNote.swift
移动到一个名为 DemoSharedCode
的新自定义框架。除了确保 Xcode 在应用程序目标中使用框架外,我还确保
- 将
DemoNote
及其变量和方法标记为 public
以便它们在框架外可见
- 将
import DemoSharedCode
添加到任何想要使用 DemoNote
的 class
所以现在 编译器 很高兴。但是在 运行 时间解压缩失败并出现此错误:
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 作为应用程序一部分时的名称.
这只是必要的,因为我想保留以前存在的数据。
我有一个非常简单的 Swift 应用程序,它有一个名为 DemoNote
的模型 class。 DemoNote
个实例的数组是 read/written 通过键控归档。当 DemoNote
包含在应用程序中时,这工作正常。
但后来我将 DemoNote.swift
移动到一个名为 DemoSharedCode
的新自定义框架。除了确保 Xcode 在应用程序目标中使用框架外,我还确保
- 将
DemoNote
及其变量和方法标记为public
以便它们在框架外可见 - 将
import DemoSharedCode
添加到任何想要使用DemoNote
的 class
所以现在 编译器 很高兴。但是在 运行 时间解压缩失败并出现此错误:
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 作为应用程序一部分时的名称.
这只是必要的,因为我想保留以前存在的数据。