Swift函数参数很奇怪

时间:2014-10-19 16:14:48

标签: swift parameters func

奇怪的代码如下

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")

两个来源是矛盾的。

你们能解释一下吗?

1 个答案:

答案 0 :(得分:2)

这是因为:

  

Swift为具有默认值的任何参数提供自动外部名称。自动外部名称与本地名称相同,就好像您在代码中的本地名称之前写了一个哈希符号。

摘自External Names for Parameters with Default Values

通常,函数(注意,全局函数而不是类/结构方法)不会为其参数自动生成外部名称(但您可以手动指定它们)。如果参数具有默认值,swift会自动使用本地名称作为外部名称(除非您提供自己的名称)。如果您不希望这种情况发生,请在参数前面加上下划线:

func sayHello3(_ name : String = "world") {

对于类/结构方法,Swift自动为所有方法参数提供外部名称,但第一个。同样,您可以通过为第一个参数显式指定外部名称来自由地更改它,和/或通过在下划线前加上来禁用所有其他参数的外部名称。