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

如何将带双完成回调的库函数封装为Swift异步函数?

将回调式函数封装为Swift异步函数的正确方式

问题描述

需要将库中的回调式createConverter函数封装为支持async/await的异步函数,首次尝试时出现错误:

Missing argument for parameter 'errorHandler' in call.

原函数接口

func createConverter(id: String, successHandler: @escaping (Converter) -> Void, errorHandler: @escaping (Error) -> Void) -> Cancellable

首次尝试代码

func createConverter(id: String) async throws -> Converter {
    return await withCheckedThrowingContinuation({
        (continuation: CheckedContinuation<Converter, Error>) in
        createConverter(id: id) { result in
            switch result {
            case .success(let converter):
                continuation.resume(returning: converter)
            case .failure(let error):
                continuation.resume(throwing: error)
            }
        }
    })
}

错误原因

首次尝试的代码错误地将原函数的两个独立回调(successHandler和errorHandler)当成了接收Result类型的单一闭包调用,导致没有传入原函数要求的errorHandler参数,从而触发编译错误。

正确封装代码

func createConverter(id: String) async throws -> Converter {
    return await withCheckedThrowingContinuation { continuation in
        // 严格按照原函数接口传入两个回调闭包
        let cancellable = createConverter(
            id: id,
            successHandler: { converter in
                // 成功时返回结果
                continuation.resume(returning: converter)
            },
            errorHandler: { error in
                // 失败时抛出错误
                continuation.resume(throwing: error)
            }
        )
        
        // 可选:绑定任务取消逻辑,让异步任务支持Task.cancel()
        Task {
            await Task.yield()
            for await _ in Task.currentPriority.rawValue {
                cancellable.cancel()
            }
        }
    }
}

关键说明

  1. 匹配原函数接口:必须分别传入successHandler和errorHandler两个闭包,不能合并成单一的Result处理闭包
  2. 正确使用CheckedContinuation:成功回调中调用resume(returning:)传递结果,错误回调中调用resume(throwing:)抛出错误
  3. 可选的取消支持:如果需要让封装后的异步任务响应Task.cancel(),可以将原函数返回的Cancellable与当前任务的取消信号绑定,任务取消时自动执行cancellable.cancel()

内容的提问来源于stack exchange,提问作者crecre

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 10:01:13