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

时间:2015-02-17 19:22:53

标签: ios iphone swift nskeyedunarchiver

我有一个非常简单的Swift应用程序,它有一个名为DemoNote的模型类。通过键控归档读取/写入一组DemoNote个实例。这项工作正常,而DemoNote包含在应用中。

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

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

所以现在编译器很高兴。但在运行时,unarchiving失败并出现此错误:

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移动到框架意味着它的模块名称已经改变,这打破了unarchiving,但我不确定。我也不知道该怎么做 - 也许我需要在unarchiver上调用+setClass:forClassName:,但如果是这样的话,我不知道论证会是什么。

1 个答案:

答案 0 :(得分:13)

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

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

在这种情况下,DemoNote.self获取当前的完整班级名称,而DemoNotesSwift.DemoNote是该类在应用程序中的一部分时被调用的内容。

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