ios - 添加了自定义框架,现在 Swift 无法解压数据

标签 ios iphone swift nskeyedunarchiver

我有一个非常简单的 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/

相关文章:

ios - UITableView 定位在 UIView 内部

ios - Unity-Xcode错误: linker command failed with exit code 1 (use -v to see invocation)

ios - NSDateFormatter "Month"3 个字母而不是完整的单词

iphone - 几个 Obj C 问题,包括一个错误

ios - asyncAfter 似乎没有时间延迟 - Swift

iphone - UIView的addSubview真的保留了view吗?

python - 无法将 mdm 负载和命令发送到设备

Swift 3.0 排序 - 传递给不带参数的调用的参数

macos - 将窗口直接放置在事件窗口后面

ios - ViewController 关闭 swift ios