什么是_:在Swift中告诉我?

函数定义中唯一的下划线是什么意思?

例如map(_:)

我明白,当定义函数时,我可以这样做:

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

那么我myFunc(_string:)它作为myFunc(_:)而不是myFunc(_string:) ,即有目的地隐藏参数名称?

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中,默认情况下,第一个参数名总是没有被外部化,其他的参数名默认外部的。 在Swift1.2和之前,外化规则取决于声明出现的地方,这是不必要的矛盾和混淆。]

_用于定义参数未被命名

如果有多个_表示不需要在函数调用中命名参数

 func myFunc(name:String, _ age:String){ } myFunc(“Milo", "I'm a really old wizard") 

如果你不使用下划线,你可以使用

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

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

关于如何引用你的函数,你不必为函数调用传递任何名字。
但是既然你也没有定义一个参数types,在我看来,这似乎是一个无效的例子(它至less不适用于xcode 7与SWIFT 2.0)

编辑:
自swift 3.0以来

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

应该使用

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

例如,

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

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

代表两个不同的function,一个是在调用函数时为第一个String参数提供外部标签,另一个在没有使用标签的情况下为其提供外部标签,如下所示:

myFunc(myString: "hi")

myFunc("hi")

因此,为了确定一个函数,我们在每个参数中包含外部标签,其中':'表示参数将被提供 – 例如yourFunc(arg1:arg2:)将会带2个参数。

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

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

myFunc(myString:)myFunc(_:)