您不能将 String->Void 类型的闭包传递给 AnyObject->Void 类型的参数。
但是,您可以定义一个通用函数:
func saveWithCompletionObject<T>(obj : T, success : T -> Void, failure : Void -> Void) {
// ...
success(obj)
}
现在编译器可以验证obj 具有相同的类型
作为success的参数,例如:
func doSomething(success : String -> Void, failure : Void -> Void)
{
saveWithCompletionObject("Example", success, failure)
}
func doSomethingElse(success : Int -> Void, failure : Void -> Void)
{
saveWithCompletionObject(13, success, failure)
}
但我建议saveWithCompletionObject 只需要Void->Void
参数(无泛型):
func saveWithCompletionObject(success : Void -> Void, failure : Void -> Void) {
// ...
success()
}
调用者包装它的闭包:
func doSomething(success : String -> Void, failure : Void -> Void)
{
saveWithCompletionObject( { success("Example") } , failure)
}
func doSomethingElse(success : Int -> Void, failure : Void -> Void)
{
saveWithCompletionObject( { success(13) }, failure)
}
这更灵活,例如对于具有多个的回调函数
参数:
func andNowForSomethingCompletelyDifferent(success : (Int, Double) -> Void, failure : Void -> Void)
{
saveWithCompletionObject( { success(13, M_PI) }, failure)
}