什么是_:在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(_:)