我需要将这样的功能从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) - >无效
//这里有一些代码
打印(成功)
}
但是,如何发送两个闭包?
谢谢
答案 0 :(得分:5)
这个怎么样?
func getForDemoDataWithToken(
token: Token,
onSuccess: (demoData:NSArray?) -> (),
onFailure: (error:NSError?) -> ()) {
}
getForDemoDataWithToken(Token(),
onSuccess: { (demoData) -> () in
},
onFailure: { (demoData) -> () in
}
)
我经常看到Swift代码只使用了一个闭包。因此,您可以只使用onSuccess
而不是2个不同的onFailure
和completion
个闭包。
接下来我们应该记住,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 参数的闭包。
如果需要将闭包表达式作为函数的最终参数传递给函数,并且闭包表达式很长,则将其写为尾随闭包会很有用。尾随闭包是一个闭包表达式,它写在它支持的函数调用的括号之外(和在之后)。
例如,您也可以从上面重写我建议的代码段:
acceptsTwoClosures(onSuccess: { print("Success: \($0)") }) {
print("Failure: \($0)")
}
..正如你所看到的,我可以将acceptsTwoClosures
调用之外的第二个(即 last )闭包传递为尾随闭包,但我仍然需要通过第一个作为正常参数。