说我有一个函数,在默认参数之后有非默认参数,如下所示:
func f(first:Int = 100, second:Int){}
如何调用它并使用第一个参数的默认值?
答案 0 :(得分:69)
当前编译器允许在参数列表中间使用默认参数。
如果要使用first
参数的默认值,可以调用此函数:
f(1)
如果要为first
参数提供新值,请使用其外部名称:
f(first: 3, 1)
文档explains表示具有默认值的参数会自动赋予外部名称:
如果您没有自己提供外部名称,Swift会为您定义的任何默认参数提供自动外部名称。自动外部名称与本地名称相同,就好像您在代码中的本地名称之前写了一个哈希符号。
答案 1 :(得分:17)
您应该在参数列表的末尾有默认参数。
func f(second:Int, first:Int = 100){}
f(10)
在函数末尾放置带默认值的参数 参数列表。这可以确保对函数的所有调用都使用 他们的非默认参数的顺序相同,并明确表示 在每种情况下都会调用相同的函数。
答案 2 :(得分:4)
在Swift 3上:
func defaultParameterBefore(_ x: Int = 1, y: Int ) {}
调用
defaultParameterBefore(2)
会引发此错误
error: missing argument for parameter 'y' in call
唯一的例外是:
例如:
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 version :DEVELOPMENT-SNAPSHOT-2016-04-12
答案 3 :(得分:0)
如果它是类的方法,则需要像这样调用它
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