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

How to create function with two closures as params in Swift?

我需要将这样的函数从 Objective-C 语言翻译成 Swift 语言。但是找不到示例,也不知道如何将 2 个闭包发送到 Swift 中的 func。

例如Objective-C中的原函数:

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

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

getForDemoDataWithToken(token) {(success: String) -> Void in

// some code here

print(success)

}

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

谢谢

这个呢?

声明

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

}

调用

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

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

    }
)

更 Swifty 的方法

我经常看到 Swift 代码只使用 一个闭包 。因此,您可以只使用 completion.

而不是 2 个不同的 onSuccessonFailure 闭包

接下来我们应该记住 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
    }
}

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

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

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

acceptsTwoClosures(
    onSuccess: { print("Success: \([=10=])") },
    onFailure: { print("Failure: \([=10=])") }
)

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

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

来自documentation

If you need to pass a closure expression to a function as the function’s final argument and the closure expression is long, it can be useful to write it as a trailing closure instead. A trailing closure is a closure expression that is written outside of (and after) the parentheses of the function call it supports.

例如,您也可以像这样重写我在上面建议的代码段:

acceptsTwoClosures(onSuccess: { print("Success: \([=11=])") }) {
    print("Failure: \([=11=])")
}

.. 如您所见,我可以在 acceptsTwoClosures 调用之外传递第二个(即 last)闭包作为尾随闭包,但我仍然有将第一个作为普通参数传递。