【问题标题】:How to create generic closures in Swift如何在 Swift 中创建通用闭包
【发布时间】:2014-12-03 14:25:22
【问题描述】:

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

我的第一次尝试是这样做:

func saveWithCompletionObject(obj : AnyObject, success : AnyObject -> Void, failure : Void -> Void)

但是一旦我用另一个块调用这个函数,例如:

func doSomething(success : String -> Void, failure : Void -> Void)
{
    saveWithCompletionObject("Example", success, failure)
}

我收到一个错误:'AnyObject' is not a subtype of 'String'

提前致谢!

【问题讨论】:

标签: swift closures block


【解决方案1】:

您不能将 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-&gt;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)
}

【讨论】:

  • 有没有办法像saveWithCompletionObject(String.class, success, failure)这样调用函数,以便编译器知道要使用什么类型?这样的函数的声明会是什么样子?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
相关资源
最近更新 更多