我在Swift中实现NSCoding时遇到了麻烦。我构建了以下基本类来演示问题。当我运行此代码时,我收到运行时错误,例如:
“SForwarding:警告:类'_TtC4Projet5Test'的对象0x102801f60没有实现methodSignatureForSelector: - 提前麻烦”
我已经看到其他示例代码包含NSObject作为基类,但我使用的是纯粹的Swift实现,而NSCoding的文档似乎并没有提到这是一个要求。
任何帮助将不胜感激!
THX。
class Test: NSCoding {
var array: [String]?
init() {
}
required init(coder decoder: NSCoder!) {
array = decoder.decodeObjectForKey("array") as? [String]
}
func encodeWithCoder(aCoder: NSCoder!) {
aCoder.encodeObject(self.array, forKey: "array")
}
}
var myTest = Test()
myTest.array = [String]()
myTest.array!.append("Nick")
NSKeyedArchiver.archiveRootObject(myTest, toFile: "/Users/test/Desktop/test.archive")
答案 0 :(得分:4)
问题是Test不是从NSObject派生的。它需要或者(正如消息所说)将会遇到麻烦。
class Test: NSObject, NSCoding {
原因是NSCoding对实例将响应的其他消息做出各种假设 - 例如methodSignatureForSelector:
。非NSObject类不会这样做。如果你看一下NSObject(和NSObjectProtocol)的文档,你会发现那里有很多重要的东西,如果你不是从NSObject派生出来的,那么你放弃了所有这些东西。
NSCoding的文档似乎没有提到这是一项要求
因为NSCoding已经存在了20年,而Swift才刚刚出现。你不能指望文档提到这样的事情。来自Objective-C Cocoa API的东西显然需要Objective-C Cocoa对象。
答案 1 :(得分:2)
如果Swift类不包含'@objc'指令或从NSObject扩展,那么:
Pure Swift类的行为有点像C ++,具有非常令人钦佩的性能,但也有很多刚性。 (但与C ++不同,我们有ARC,没有指针,选项和没有指针头痛)。这使得它成为一种引人注目的系统编程语言,并且在需要进行性能调优时也可以使用 - 当你通常在Cocoa应用程序中使用纯C或目标c ++时。
同时,Cocoa强烈依赖于ObjC运行时的动态和内省性质。并且考虑到95%的性能提升调整了5%的代码,在Cocoa应用程序中,建议默认扩展NSObject。这样,所有Cocoa功能 - NSCoding,KVO等都可以按预期工作。