斯威夫特FUNC参数怪异

问题描述:

奇怪的代码如下斯威夫特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") 

两个源是矛盾的。

你们能解释一下吗?

这是因为:

斯威夫特具有默认值的任何参数提供自动外部名称。自动外部名称与本地名称相同,就像您在代码中的本地名称之前写入了散列符号一样。

摘自External Names for Parameters with Default Values

通常的功能(和注释,一个全球性的功能,而不是一类/结构方法)不会自动生成它的参数外部名称(但你可以手动指定它们) 。如果参数具有默认值,swift会自动使用本地名称作为外部名称(除非您提供自己的名称)。如果你不希望这样的事情发生,只是用下划线前缀参数:

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

至于类/结构的方法,雨燕自动为所有方法的参数,但首先提供外部名称。同样,您可以*地通过为第一个参数指定一个外部名称来改变它,并且/或者通过用下划线前缀来禁用所有其他参数的外部名称。

+0

_(下划线) user1272854 2014-10-19 19:47:08

+0

在swift中生成一个自动外部名称,并且您不需要外部名称,只需在本地名称前加下划线并且不会为该参数生成外部名称。这在文档中有解释(链接在答案中) – Antonio 2014-10-19 19:56:37