抱歉,这个问题很糟糕,但我一直在阅读 swift 书和教程,我发现了这个 NSCoder 协议并禁用它等等。
required init(coder aDecoder: NSCoder) {
fatalError("not been implemented")
}
我了解所需的初始化,但我不了解我必须编写的这段代码。是不是说如果传递了一个 NSCoder 就会发生致命错误?还有,这个词coder
是什么意思?为什么我需要它在变量名前面?
该代码的目的是满足 NSCoding 协议的要求,该协议规定您必须实现init(coder:)
,而无需实际编写该方法的任何有意义的实现。如果您在这里有一些有意义的事情要做,您会删除该fatalError
行并做一些有意义的事情。事实上,你是在说:“我没有实现这个,所以如果它被调用,我们就会遇到严重的麻烦,我想故意崩溃!”
该词coder
是此参数的“外部名称”。在 Swift 中,参数可以同时具有内部名称和外部名称。coder
意思是,当你调用这个函数时,调用这个参数coder:
(这实际上就是你所做的)。这是绝对必要的,因为这就是包括 Cocoa 在内的世界对这个功能的看法;coder:
是它名字的一部分,它的身份。但是,这个词aDecoder
只是局部参数的内部名称,只是一个服务建议;您可以使用另一个内部名称,甚至可以删除它,这会使内部名称与外部名称相同。
这里的情况是您正在覆盖一个 Cocoa 函数,并且您必须使用该函数的正确名称。这意味着函数名称、外部参数名称和参数类型。它们都必须完全正确,否则它将与您应该覆盖的功能不同。但是内部参数名称,传递到函数体的局部变量,由您决定,您可以根据需要更改它们。我经常这样做。
这意味着该方法未实现。它看起来确实像某人需要的方法(签名与合同/接口/协议匹配) - 这就是它获得特定参数的原因(在本例中为 aDecoder)。但是方法本身还没有写出来。在这些情况下,您可以什么都不做,但有时您不想默默地失败,然后您就像示例代码一样引发错误。那并不是真正特定于所需的 init 或编码器。