Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Swift中使用NSCoding协议_Swift - Fatal编程技术网

在Swift中使用NSCoding协议

在Swift中使用NSCoding协议,swift,Swift,在Swift中实现NSCODE时遇到问题。我构建了以下基本类来演示这个问题。运行此代码时,会出现运行时错误,例如: “SForwarding:警告:类'\u TtC4Projet5Test'的对象0x102801f60未实现methodSignatureForSelector:--前方有故障” 我见过其他示例代码将NSObject作为基类,但我使用的是一个纯粹的Swift实现,NSCoding文档似乎没有提到这一点 任何帮助都将不胜感激 Thx 问题在于测试不是从NSObject派生的。它需要这

在Swift中实现NSCODE时遇到问题。我构建了以下基本类来演示这个问题。运行此代码时,会出现运行时错误,例如:

“SForwarding:警告:类'\u TtC4Projet5Test'的对象0x102801f60未实现methodSignatureForSelector:--前方有故障”

我见过其他示例代码将NSObject作为基类,但我使用的是一个纯粹的Swift实现,NSCoding文档似乎没有提到这一点

任何帮助都将不胜感激

Thx


问题在于测试不是从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自省不起作用
<>纯SWIFT类有点像C++,性能非常好,但也有很多刚性。(但与C++不同,我们有弧、无指针、选择和无指针头痛)。这就成为了一个引人注目的系统编程语言,并且在需要性能调整时也可以使用——在你通常会在COACAP应用程序中降到纯C或目标C++的时候。p> 同时,Cocoa强烈依赖于ObjC运行时的动态和内省特性。考虑到95%的性能提升是通过优化5%的代码实现的,在Cocoa应用程序中,建议默认情况下扩展NSObject。通过这种方式,您的所有Cocoa功能(NSCoding、KVO等)都将按预期工作

class Test: NSObject, NSCoding {