如何在 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 个不同的 onSuccess
和 onFailure
闭包
接下来我们应该记住 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 参数的闭包在函数签名中。
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)闭包作为尾随闭包,但我仍然有将第一个作为普通参数传递。
我需要将这样的函数从 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
.
onSuccess
和 onFailure
闭包
接下来我们应该记住 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 参数的闭包在函数签名中。
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)闭包作为尾随闭包,但我仍然有将第一个作为普通参数传递。