You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:42:38