【发布时间】:2015-04-18 14:51:35
【问题描述】:
我有一个非常简单的 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:,但如果是这样,我不知道参数会是什么。
【问题讨论】:
-
归档器在内部做的事情有点模糊。有一个开源项目可以帮助阅读档案(我放弃了,太噩梦了)。但它可能会存储一些类签名。因此,如果您在引擎盖下更改它(这绝不是一个好主意),它会(在您的情况下很可能)会发牢骚。只是一个想法,不是基于实践经验。
-
我之前在 Objective-C 中做过同样的事情(从字面上看,就像我在用不同的语言做同样的演示项目一样)并且没问题。必须可以在 Swift 中做同样的事情。
-
我明白了。所以我猜 Swift 框架现在不同了。尽管两种语言之间有一些免费的桥接,但它似乎在这里不起作用。您可能只能尝试错误:-/我猜您已经在 Google 上搜索了
NSInvalidUnarchiveOperationException并找到了 SO 答案。
标签: ios iphone swift nskeyedunarchiver