【问题标题】:Argument labels for initialization parameters in Swift 3.1Swift 3.1 中初始化参数的参数标签
【发布时间】:2017-12-11 23:39:47
【问题描述】:

Apple 的书“Swift 编程语言 (Swift 3.1)” 陈述如下:

与函数和方法参数一样,初始化参数既可以有一个在初始化器主体中使用的参数名称,也可以有一个在调用初始化器时使用的参数标签。

但是,初始化器在括号前没有函数和方法那样的标识函数名称。因此,初始化器参数的名称和类型在确定应该调用哪个初始化器时起着特别重要的作用。 因此,如果您不提供,Swift 会为初始化程序中的每个参数提供一个自动参数标签。

我不明白最后一句话,因为在参数名称/标签方面,我没有注意到函数/方法和初始化程序之间的任何区别。如何为初始化程序自动提供参数标签?

【问题讨论】:

  • 至少对我来说,这听起来像是 Swift 2.2 语言指南的保留,他们从未删除/更新过。在 Swift 2 中,方法和顶级函数没有为第一个参数提供自动参数标签,如果需要,您必须显式指定它(但初始化程序为每个参数提供)。但无论如何,措辞可能会更清晰。
  • 这也是我最初的想法 :) 请看看下面 Rob Napier 回答下的 cmets,我们可能误解了他们的话。
  • 我不相信他们在谈论成员初始化器,因为他们没有明确提到它,并且该部分在指南的后面部分。
  • 也许你是对的,我还没有:)

标签: swift initializer


【解决方案1】:

描述的特性是这样的:给定一个结构:

struct Point {
    let x: Double
    let y: Double
}

Swift 会自动生成Point.init(x: Double, y: Double)。如果你在主 struct 定义中添加你自己的 init 方法,那么 Swift 将不会自动创建 init。 (如果您在扩展中添加init,那么您自动获得init。这就是人们经常在结构的扩展中添加便利init 的原因。

最后一段试图说明的是Point(x:y:)Point(_:_:) 更可取。初始化器中的标签比方法名称中的标签更有价值,因为所有初始化器都具有相同的“基本”名称(“init”)。他们只是在解释为什么他们没有选择一些人可能期望来自其他语言的更隐含的默认值。

简而言之,有时未标记的参数在方法中是否有意义,这取决于方法的名称是什么以及第一个参数的明确程度。但在init 中,未标记的参数应该被高度怀疑。

【讨论】:

  • 一开始我以为“if you don't provide one”是指参数标签,但似乎是指初始化器本身。我说的对吗?
  • 没错。是的,那里的语言有点模棱两可。如果您已经知道它们的意思,那是最有意义的:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多