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