【问题标题】:What do the words before variables mean in init()s?init()s 中变量前面的词是什么意思?
【发布时间】:2015-02-01 20:14:42
【问题描述】:

抱歉,这个问题很糟糕,但我一直在阅读 swift 书和教程,我发现了这个 NSCoder 协议并禁用它等等。

required init(coder aDecoder: NSCoder) {
    fatalError("not been implemented")
}

我了解所需的初始化,但我不了解我必须编写的这段代码。是不是说如果传递了一个NSCoder,就会发生致命错误?另外,coder 这个词是什么意思?为什么我需要它在变量名前面?

【问题讨论】:

  • 你指的是哪个词? “必需的”? “编码器”?

标签: swift nscoding decoder nscoder


【解决方案1】:

该代码的目的是满足 NSCoding 协议的要求,该协议规定您必须实现init(coder:),而无需真正编写该方法的任何有意义的实现。如果您在这里有一些有意义的事情要做,您将删除fatalError 行并做一些有意义的事情。实际上,您是在说:“我没有实现这一点,所以如果它被调用,我们就会遇到严重的麻烦,我想故意崩溃!”

单词coder 是此参数的“外部名称”。在 Swift 中,参数可以同时具有内部名称和外部名称。 coder 的意思是,当你调用这个函数的时候,调用这个参数coder: (这实际上就是你所做的)。这是绝对必要的,因为这就是包括 Cocoa 在内的世界对这个功能的看法; coder: 是其名称和身份的一部分。但是,aDecoder这个词只是本地参数的内部名称,只是一个服务建议;您可以使用另一个内部名称,甚至可以删除它,这会使内部名称与外部名称相同。

这里的情况是您正在覆盖一个 Cocoa 函数,并且您必须使用该函数的正确名称。这意味着函数名称、外部参数名称和参数类型。它们都必须完全正确,否则它将与您应该覆盖的功能不同。但是内部参数名称,传递到函数体的局部变量,由你决定,你可以根据需要改变它们。我经常这样做。

【讨论】:

  • OK...这就是为什么我可以简单地做 coder: NSCoder 而我不需要变量名?
  • 没错。这样既保留了外部名称,也将其用作内部名称。
  • 阅读书中关于函数参数名称的部分:developer.apple.com/library/ios/documentation/Swift/Conceptual/…
  • 非常感谢。现在阅读文档的那部分。所以只需确认:当协议需要某个类/结构/任何东西来接受某个变量时,您使用该名称来实现协议,然后如果您想使用,可以选择在全局版本之后定义 var 的本地版本一个不同的名字。对吗?
  • 比这更笼统。当您执行requiredoverride 函数时,您必须完全正确地获取名称和外部参数名称以及参数类型 - 但内部参数名称完全取决于您。
【解决方案2】:

表示这个方法没有实现。它看起来确实像某人需要的方法(签名与合同/接口/协议匹配) - 这就是它获得特定参数的原因(在本例中为 aDecoder)。但是方法本身还没有写出来。在这些情况下,您可以什么都不做,但有时您不想默默地失败,然后您就像示例代码一样引发错误。这并不是真正特定于所需的 init 或编码器。

【讨论】:

    猜你喜欢
    • 2022-01-07
    • 2012-10-12
    • 2010-10-03
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多