奇怪的代码如下
func sayHello2(name : String){
println("Hello! \(name)")
}
sayHello2(name : "andy") // Error ->Playground execution failed: <EXPR>:25:10: error:
extraneous argument label 'name:' in call
sayHello6(name : "andy")
sayHello2("andy") // No Error -> Hello! andy
func sayHello3(name : String = "world"){
println("Hello! \(name)")
}
sayHello6(name : "andy") // No Error -> Hello! andy
sayHello6("andy") //Error -> Playground execution failed: <EXPR>:31:11: error: missing
argument label 'name:' in call
sayHello2("Choi")
两个来源是矛盾的。
你们能解释一下吗?
答案 0 :(得分:2)
这是因为:
Swift为具有默认值的任何参数提供自动外部名称。自动外部名称与本地名称相同,就好像您在代码中的本地名称之前写了一个哈希符号。
摘自External Names for Parameters with Default Values
通常,函数(注意,全局函数而不是类/结构方法)不会为其参数自动生成外部名称(但您可以手动指定它们)。如果参数具有默认值,swift会自动使用本地名称作为外部名称(除非您提供自己的名称)。如果您不希望这种情况发生,请在参数前面加上下划线:
func sayHello3(_ name : String = "world") {
对于类/结构方法,Swift自动为所有方法参数提供外部名称,但第一个。同样,您可以通过为第一个参数显式指定外部名称来自由地更改它,和/或通过在下划线前加上来禁用所有其他参数的外部名称。