Swift:在默认参数之前使用默认参数
说我有一个函数,默认参数后有非默认参数,如下所示:
func f(first:Int = 100, second:Int){}
我怎样才能调用它,并使用第一个参数的默认值?
当前的编译器确实允许在参数列表中间的默认参数。
如果你想使用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