在Swift中使用NSCoding协议
在Swift中实现NSCODE时遇到问题。我构建了以下基本类来演示这个问题。运行此代码时,会出现运行时错误,例如: “SForwarding:警告:类'\u TtC4Projet5Test'的对象0x102801f60未实现methodSignatureForSelector:--前方有故障” 我见过其他示例代码将NSObject作为基类,但我使用的是一个纯粹的Swift实现,NSCoding文档似乎没有提到这一点 任何帮助都将不胜感激 Thx在Swift中使用NSCoding协议,swift,Swift,在Swift中实现NSCODE时遇到问题。我构建了以下基本类来演示这个问题。运行此代码时,会出现运行时错误,例如: “SForwarding:警告:类'\u TtC4Projet5Test'的对象0x102801f60未实现methodSignatureForSelector:--前方有故障” 我见过其他示例代码将NSObject作为基类,但我使用的是一个纯粹的Swift实现,NSCoding文档似乎没有提到这一点 任何帮助都将不胜感激 Thx 问题在于测试不是从NSObject派生的。它需要这
问题在于测试不是从NSObject派生的。它需要这样做,否则(正如信息所说)前面会有麻烦
class Test: NSObject, NSCoding {
原因是NSCoding对实例将响应的其他消息做出了各种假设,例如methodSignatureForSelector:
。非NSObject类不会这样做。如果你看一看NSObject(和NSObjectProtocol)的文档,你会发现其中有很多重要的东西,如果你不是从NSObject派生出来的,你就会放弃所有这些东西
NSCoding文档似乎没有将此作为一项要求
因为NSCoding已经存在了20年,而Swift才刚刚出现。您不能期望文档中会提到这样的事情。来自Objective-C Cocoa API的内容显然需要Objective-C Cocoa对象。如果Swift类不包含“@objc”指令或扩展自NSObject,则:
- 将使用静态和vtable方法分派。这会更快,但许多cocoa功能(如KVO和消息转发)都需要动态调度李>
- Objc自省不起作用
class Test: NSObject, NSCoding {