单独的下划线在函数定义中意味着什么?
e.g。 map(_:)
据我所知,在定义函数时我可以这样做:
func myFunc(_ string: String) { ... }
我是否会将其称为myFunc(_:)
而不是myFunc(_string:)
,即故意隐藏参数名称?
答案 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(_:)