您可以将以下代码放入游乐场。
import UIKit
class MyClass {
func foo(a: String, b: () -> ()) {
b()
}
func bar(a: String = "a", b: () -> ()) {
b()
}
}
let object = MyClass()
object.foo("x") { () -> () in
println("foo")
}
object.bar() { () -> () in
println("foo")
}
object.bar()
来电会产生Missing argument for parameter 'b' in call
问题是:我做错了什么,或者默认参数值的方法不支持尾随闭包?
答案 0 :(得分:2)
它看起来像尾随闭包的问题 - 这段代码有效:
object.bar(b: { () -> () in
println("foo")
})
但是,如果删除了外部名称:
func bar(a: String = "a", _ b: () -> ()) {
b()
}
这不再有效:
object.bar({ () -> () in
println("foo")
})
此外,使用具有字符串作为第二个参数的函数:
func test( val1: String = "a", val2: String) {
}
默认参数已正确分配,因此成功:
test("me")
这与使用闭包不同。
结论:如果未指定至少一个具有默认值的参数,则具有默认值和尾随闭包的参数的方法或函数不起作用。避免尾随闭包,只有当参数具有外部名称时,该功能才起作用。