如何在Swift中创建通用闭包

如何在Swift中创建通用闭包,swift,closures,block,Swift,Closures,Block,我想创建一个在swift中使用通用闭包(block)的函数 我的第一次尝试是: func saveWithCompletionObject(obj : AnyObject, success : AnyObject -> Void, failure : Void -> Void) 但只要我用另一个块调用此函数,例如: func doSomething(success : String -> Void, failure : Void -> Void) { saveW

我想创建一个在swift中使用通用闭包(block)的函数

我的第一次尝试是:

func saveWithCompletionObject(obj : AnyObject, success : AnyObject -> Void, failure : Void -> Void)
但只要我用另一个块调用此函数,例如:

func doSomething(success : String -> Void, failure : Void -> Void)
{
    saveWithCompletionObject("Example", success, failure)
}
我得到一个错误:
“AnyObject”不是“String”的子类型。


提前谢谢

不能将
String->Void
类型的闭包传递给
AnyObject->Void
类型的参数

但是,您可以定义一个通用函数:

func saveWithCompletionObject<T>(obj : T, success : T -> Void, failure : Void -> Void) {
    // ...
    success(obj)
}
但是我建议,
saveWithCompletionObject
只需要一个
Void->Void
参数(不带泛型):

调用方将其闭包打包:

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)
}

看看这个!它可能会帮助你!是否有一种调用函数的方法,如
saveWithCompletionObject(String.class,success,failure)
,以便编译器知道使用哪种类型?这种功能的声明是什么样的?
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)
}