是的,函数只是值,所以可以提供它们作为默认值
// just to show you can do it with inline closures or regular functions
func doNothing<T>(t: T) -> Void { }
func sendBody(
body: NSData? = nil,
success: (data: NSData) -> Void = { _ in return },
failure: (data: NSData?) -> Void = doNothing
)
{ }
或者,您可以将它们设置为可选,这样您就可以检测调用方是否通过了一个:
func sendBody(
body: NSData? = nil,
success: ((NSData) -> Void)? = nil,
failure: ((NSData?) -> Void)? = nil
)
{ success?(NSData()) }
sendBody(success: { _ in print("ah, yeah!") })
如果这样做,也值得注意:如果调用方使用尾随闭包语法,则参数列表中的闭包将为last.因此,您希望最后一个是用户最有可能提供的,这可能就是成功的结局:
func sendBody(
body: NSData? = nil,
success: ((NSData) -> Void)? = nil,
failure: ((NSData?) -> Void)? = nil
)
{
if success != nil { print("passed a success closure") }
if failure != nil { print("passed a failure closure") }
}
// this prints "passed a failure closure"
sendBody { data in
print("which closure is this?")
}
除此之外,函数声明中的顺序对调用方并不重要——默认参数可以按任何顺序提供.