闭包和函数是可以互换的。任何需要传递闭包的地方,都可以传递函数。
因此,您可以为这两种情况编写一个函数并传递该函数名而不是闭包。
也就是说,您的两个示例显示了不同的参数,这与您“两个闭包完全相同”的说法相矛盾。如果他们取不同的参数,怎么可能是一样的呢?
编辑:
考虑以下函数:
func foo(value: String, completion: (String)->Void) {
completion(value)
}
如您所料,我们可以使用闭包调用 foo:
foo(value: "firstCall", completion: { value in
print("in completion handler, value = '\(value)'")
})
那会输出
在完成处理程序中,值 = 'firstCall'
我们还可以定义一个或多个签名匹配完成处理程序的函数:
func completionFunction(value: String) {
print("In \(#function), value = '\(value)'")
}
func completionFunctionTwo(value: String) {
print("In \(#function), value = '\(value)'")
}
然后这样调用:
foo(value: "secondCall", completion: completionFunction)
foo(value: "thirdCall", completion: completionFunctionTwo)
请注意我们只是将函数名称作为完成处理程序传递。这相当于传递一个内联闭包。
那些调用会输出:
在completionFunction(value:)中,value = 'secondCall'
在 completionFunctionTwo(value:), value = 'thirdCall'
最后,您可以创建一个包含闭包的变量,并将其作为您的完成处理程序传递:
let aCompletionClosure: (String) -> Void = { value in
print("In completion closure, value = '\(value)'")
}
foo(value: "forthCall", completion: aCompletionClosure)
输出:
在完成闭包中,value = 'forthCall'