如何将带双完成回调的库函数封装为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() } } } }
关键说明
- 匹配原函数接口:必须分别传入
successHandler和errorHandler两个闭包,不能合并成单一的Result处理闭包 - 正确使用
CheckedContinuation:成功回调中调用resume(returning:)传递结果,错误回调中调用resume(throwing:)抛出错误 - 可选的取消支持:如果需要让封装后的异步任务响应
Task.cancel(),可以将原函数返回的Cancellable与当前任务的取消信号绑定,任务取消时自动执行cancellable.cancel()
内容的提问来源于stack exchange,提问作者crecre
相关产品推荐
相关产品推荐

