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

如何在Swift中创建两个闭包作为参数的函数?,swift,closures,func,Swift,Closures,Func,我需要把这样的函数从Objective-C翻译成Swift语言。但找不到示例,也不知道如何在Swift中将2个闭包发送到func 例如,Objective-C中的原始函数: 我知道要将1个关闭作为参数发送: getForDemoDataWithToken(token){(成功:字符串)->中的Void //这里有一些代码 打印(成功) } 但是,如何发送两个闭包 谢谢这个怎么样 宣言 调用 更快捷的方法 我通常看到Swift代码只使用了一个闭包。因此,您不必使用两个不同的onSuccess和on

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

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

我知道要将1个关闭作为参数发送:

getForDemoDataWithToken(token){(成功:字符串)->中的Void

//这里有一些代码

打印(成功)

}

但是,如何发送两个闭包

谢谢

这个怎么样

宣言 调用 更快捷的方法 我通常看到Swift代码只使用了一个闭包。因此,您不必使用两个不同的
onSuccess
onFailure
闭包,而只需要
completion

接下来,我们应该记住,
NSArray
与Swift兼容,但这不是使用数组的最快捷方式

让我们看一个应用上述两个概念的示例

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

}
您可以使用
尾随闭包
语法调用它

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: \($0)") },
    onFailure: { print("Failure: \($0)") }
)

// In the playground the above prints:
//  
// Success: Ook
// Failure: Eek
acceptsTwoClosures(onSuccess: { print("Success: \($0)") }) {
    print("Failure: \($0)")
}
您在问题中使用的方法称为尾随闭包,它仅适用于函数签名中的最后一个参数的闭包

从:

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

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

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
acceptsTwoClosures(onSuccess: { print("Success: \($0)") }) {
    print("Failure: \($0)")
}

。。如您所见,我可以将
acceptsTwoClosures
调用之外的第二个(即最后一个)闭包作为尾随闭包传递,但我仍然必须将第一个作为正常参数传递。

查看此链接我在游乐场尝试过这种方法-它不起作用。可能是语法错误。我刚重新检查过,它在我的机器上工作。您使用的是哪个版本的XCode?XCode版本7.0.1(7A1001);OS X El Capitan,版本10.11.1(15B42)奇怪。这是一个有效的版本:与您的案例有什么不同?对不起,由于缺乏调查时间,我们不得不放弃两次结案。开始使用尾随闭包。非常感谢你的帮助。我只是在想这件事。我会努力的。谢谢你也许你也想提一下
结果
类型,实际上这比两个选项更合适。
acceptsTwoClosures(onSuccess: { print("Success: \($0)") }) {
    print("Failure: \($0)")
}