Swift中的Macro Closure实现:Objective-C的CompletionBlock如何转换?
在Swift中实现类似Objective-C的CompletionBlock闭包类型别名
嗨,我来帮你搞定这个问题!Objective-C里的typedef void(^CompletionBlock)(BOOL finished);本质是给一个特定签名的闭包类型起了个别名,方便在代码里重复使用。在Swift中,我们用typealias就能实现完全等价的效果,写法还更简洁直观。
直接等价实现
对应你给出的Objective-C代码,Swift里的写法是:
typealias CompletionBlock = (Bool) -> Void
- 这里
(Bool)对应OC闭包的BOOL finished参数; -> Void对应OC里的void返回值,Swift中Void和空元组()是等价的,你也可以写成(Bool) -> (),效果完全一样。
使用示例
定义好这个类型别名后,你可以像OC里那样在函数参数、属性里复用它:
// 定义一个带完成闭包的异步任务函数 func performAsyncTask(completion: CompletionBlock) { // 模拟异步任务执行(比如网络请求、文件操作) DispatchQueue.global().async { // 假设任务执行完成 let isFinished = true // 回到主队列调用闭包(如果需要更新UI的话) DispatchQueue.main.async { completion(isFinished) } } } // 调用这个函数 performAsyncTask { finished in if finished { print("异步任务顺利完成!") } else { print("异步任务执行失败了...") } }
拓展:更复杂的闭包类型
如果需要定义带多个参数或有返回值的闭包别名,同样用typealias即可,比如:
// 带结果状态和错误信息的完成闭包 typealias ResultCompletion = (Bool, Error?) -> Void // 有返回值的闭包(比如用于输入验证) typealias ValidationBlock = (String) -> Bool
内容的提问来源于stack exchange,提问作者Luda
相关产品推荐
相关产品推荐

