Swift:在默认参数之前使用默认参数

说我有一个函数,默认参数后有非默认参数,如下所示:

func f(first:Int = 100, second:Int){} 

我怎样才能调用它,并使用第一个参数的默认值?

当前的编译器确实允许在参数列表中间的默认参数。

Playground的屏幕截图

如果你想使用first参数的默认值,你可以调用这个函数:

 f(1) 

如果要为第first参数提供新值,请使用其外部名称:

 f(first: 3, 1) 

该文档解释了具有默认值的参数会自动给出一个外部名称:

如果你自己没有提供外部的名字,Swift为你定义的任何默认参数提供了一个自动的外部名字。 自动外部名称与本地名称相同,就像您在代码中的本地名称之前写入了散列符号一样。

您应该在参数列表的末尾有默认的参数。

 func f(second:Int, first:Int = 100){} f(10) 

将参数的默认值放在函数参数列表的末尾。 这可以确保对函数的所有调用对其非默认参数使用相同的顺序,并且清楚地表明在每种情况下都调用了相同的函数。

文档链接

在Swift 3上:

 func defaultParameterBefore(_ x: Int = 1, y: Int ) {} 

调用

 defaultParameterBefore(2) 

会引发这个错误

 error: missing argument for parameter 'y' in call 

唯一的例外是:

  • 在默认参数之前有一个参数;
  • 默认参数后的参数是闭包;
  • 闭包参数是最后一个参数;
  • 通过追尾closures进行调用

例如:

 func defaultParameterBetween(_ x: Int, _ y: Bool = true, _ z: String) { if y { print(x) } else z() } } // error: missing argument for parameter #3 in call // defaultParameterWithTrailingClosure(1, { print(0) } // Trailing closure does work, though. func defaultParameterWithTrailingClosure(_ x: Int, y: Bool = true, _ z: () -> Void) { if y { print(x) } else { z() } } defaultParameterWithTrailingClosure(1) { print(0) } 

SWIFT版本DEVELOPMENT-SNAPSHOT-2016-04-12

如果它是一个类的方法,你需要像这样调用它

 class Test { func f(first:Int = 100, second:Int) { println("first is \(first)") println("second is \(second)") } func other() { f(second: 4) f(first: 30, second: 5) //f(4) will not compile, and neither will f(9,12) } } 

如果函数f是全局的,则需要像这样调用它:

 f(4) f(first: 30, 5) 

这打印:

 first is 100 second is 4 first is 30 second is 5