什么是_:在斯威夫特告诉我?

时间:2015-06-16 19:04:12

标签: swift

单独的下划线在函数定义中意味着什么?

e.g。 map(_:)

据我所知,在定义函数时我可以这样做:

func myFunc(_ string: String) { ... }

我是否会将其称为myFunc(_:)而不是myFunc(_string:),即故意隐藏参数名称?

3 个答案:

答案 0 :(得分:80)

_用于定义参数未命名为

如果您有多个_,则说明您不需要在函数调用中命名参数

func myFunc(name:String, _ age:String){
}

myFunc(“Milo", "I'm a really old wizard")

如果您不使用下划线,则使用

myFunc(“Milo”, age: "I'm a really old wizard")

函数调用中不需要_。它只是用来表示某些东西没有名字。

关于如何引用您的函数,您不必为函数调用传递任何名称 但是既然你也没有定义参数类型,这在我看来就像一个无效的例子(至少在使用swift 2.0的xCode 7中不起作用)

编辑:
自swift 3.0

myFunc(name: “Milo”, age: "I'm a really old wizard")

应该使用

答案 1 :(得分:34)

Swift需要一个约定来说明函数的名称,不仅包括函数名本身(在括号之前),还包括参数的外部名称。惯例是名称后跟冒号。所以这是一个函数声明(在Swift 2.0中):

func myFunc(param1 param1:String, param2:String, param3:String) {}

这是函数的名称:

myFunc(param1:param2:param3:)

然而,在现实生活中,有可能(实际上可能)一个或多个参数不会外化任何名称。因此,我们需要一个占位符来表示该名称。下划线是占位符 - 正如下划线是声明中禁止外部化名称的符号。所以,这是另一个函数声明(在Swift 2.0中):

func myFunc2(param1:String, _ param2:String, _ param3:String) {}

这是函数的名称:

myFunc2(_:_:_:)

[Swift 2.0规范在这里很重要。在Swift 2.0中,默认情况下,第一个参数名称始终外部化,其他参数名称​​默认为外部化。在Swift 1.2及之前,外化规则取决于声明出现的位置,这是不必要的不​​一致和混淆。]

答案 2 :(得分:18)

当引用函数时,为了消除歧义,有必要提供函数名称以及它所期望的任何参数的外部名称。

例如,

func myFunc(myString string: String) { ... }

func myFunc(_ string: String) { ... }

表示两个不同的函数,一个是在调用函数时为第一个String参数提供外部标签,另一个是不使用标签的函数,如:

myFunc(myString: "hi")

myFunc("hi")

因此,为了识别功能,我们为每个参数添加了外部标签,其中':'表示要提供参数 - 例如yourFunc(arg1:arg2:)将采用2个参数。

如果没有使用外部标签,我们会放置一个下划线(' _')。

对于上面给出的2个函数,我们将使用以下方法唯一标识它们:

myFunc(myString:)myFunc(_:)