如何在Swift中创建带有两个闭包的函数作为参数?

时间:2015-12-17 20:40:11

标签: swift closures func

我需要将这样的功能从Objective-C翻译成Swift语言。但无法找到一个例子,无法在Swift中获得如何将2个闭包发送到func中。

例如,Objective-C中的原始函数:

- (void)getForDemoDataWithToken:(Token *)token
onSuccess:(void(^)(NSArray *demoData))success
onFailure:(void(^)(NSError *error))failure {
}

我知道发送1封闭作为参数:

  

getForDemoDataWithToken(token){(success:String) - >无效

     

//这里有一些代码

     

打印(成功)

     

}

但是,如何发送两个闭包?

谢谢

2 个答案:

答案 0 :(得分:5)

这个怎么样?

声明

func getForDemoDataWithToken(
    token: Token,
    onSuccess: (demoData:NSArray?) -> (),
    onFailure: (error:NSError?) -> ()) {

}

调用

getForDemoDataWithToken(Token(),
    onSuccess: { (demoData) -> () in

    },
    onFailure: { (demoData) -> () in

    }
)

更加快速的方法

我经常看到Swift代码只使用了一个闭包。因此,您可以只使用onSuccess而不是2个不同的onFailurecompletion个闭包。

接下来我们应该记住,NSArray与Swift兼容,但它不是 Swiftest 使用数组的方式。

让我们看一个应用上述2个概念的例子。

func getForDemoData(token:Token, completion:(data:[Foo]?, error:NSError?) -> ()) {

}

您可以使用trailing closure语法调用它。

getForDemoData(Token()) { (data, error) -> () in
    if let data = data where error == nil {
        // success!
    } else {
        // oh no... something wrong here
    }
}

答案 1 :(得分:1)

您应该将闭包作为普通参数传递,如下所示:

func acceptsTwoClosures(
    onSuccess onSuccess: (success: String) -> Void,
    onFailure: (failure: String) -> Void) {

        onSuccess(success: "Ook")
        onFailure(failure: "Eek")
}

acceptsTwoClosures(
    onSuccess: { print("Success: \($0)") },
    onFailure: { print("Failure: \($0)") }
)

// In the playground the above prints:
//  
// Success: Ook
// Failure: Eek

您在问题中使用的方式称为尾随闭包,它仅适用于函数签名中 last 参数的闭包。

来自documentation

  

如果需要将闭包表达式作为函数的最终参数传递给函数,并且闭包表达式很长,则将其写为尾随闭包会很有用。尾随闭包是一个闭包表达式,它写在它支持的函数调用的括号之外(和之后)。

例如,您也可以从上面重写我建议的代码段:

acceptsTwoClosures(onSuccess: { print("Success: \($0)") }) {
    print("Failure: \($0)")
}

..正如你所看到的,我可以将acceptsTwoClosures调用之外的第二个(即 last )闭包传递为尾随闭包,但我仍然需要通过第一个作为正常参数。