swift - Swift 3.1 中初始化参数的参数标签

标签 swift initializer

Apple 的书 “The Swift Programming Language (Swift 3.1)” 陈述如下:

As with function and method parameters, initialization parameters can have both a parameter name for use within the initializer’s body and an argument label for use when calling the initializer.

However, initializers do not have an identifying function name before their parentheses in the way that functions and methods do. Therefore, the names and types of an initializer’s parameters play a particularly important role in identifying which initializer should be called. Because of this, Swift provides an automatic argument label for every parameter in an initializer if you don’t provide one.

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

最佳答案

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

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(_:_:)。初始化器中的标签甚至比方法名中的标签更有值(value),因为所有初始化器都有相同的“基本”名称(“init”)。他们只是在解释为什么他们没有选择一些人可能期望来自其他语言的更隐含的默认值。

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

关于swift - Swift 3.1 中初始化参数的参数标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44974741/

相关文章:

java - 调用没有名称的 Java 方法

ios - 在 iOS 上设置 Firebase 通知时出错

ios - Swift 3 代码中的这些小方 block 符号是什么?

generics - 初始化器作为 Swift 中转换为新类型的一种方式

go - 在结构体中初始化结构体

ios - 使用 Swift 初始化一个对象以在 Firebase 上获取可选值

arrays - 如何为泛型类型扩展数组?

swift - 如何使用 Swift 将图像值传递给 ImageSlideshow

swift - 包含单词的谓词是什么

xcode - 设置 leftBarButtonItem 垂直位置