Swift中withTaskGroup返回类型及提取函数类型歧义问题求解
问题描述
提取使用URLSession获取数据并返回Result类型的Swift代码为函数时,出现错误:
Type of expression is ambiguous without a type annotation
为withCheckedContinuation的continuation添加类型注解(continuation : CheckedContinuation<Result<ApiJsonStruct, MyError>, Never>)后,withTaskGroup的group行仍报相同错误。尝试为group添加注解(group: inout TaskGroup<Result<ApiJsonStruct, MyError>>),但async关键字仍标红并显示相同错误,需明确类型指定的位置和方式。
原代码:
private func getApiJsonStruct(endpoints: [MySettings]) async -> [MyStatusStruct] { var results: [MyStatusStruct] = [] await withTaskGroup(of: Result<ApiJsonStruct, MyError>.self) { group in for cfg in endpoints { group.addTask { return await withCheckedContinuation { continuation in self.httpGetInfo(baseUrl: cfg.host) { result in continuation.resume(returning: result) } } } } for await hbResult in group { switch hbResult { case .success(let answer): print("OK.") results.append(.init(status: true)) case .failure(let error): switch error{ case .noConnection(let errUrl): print("No connection.") results.append(.init(status: false)) } } } } return results }
解决方案
问题根源是编译器无法推导addTask闭包的返回类型,导致类型歧义。只需明确该闭包的返回类型即可解决所有相关错误。
修改后的代码:
private func getApiJsonStruct(endpoints: [MySettings]) async -> [MyStatusStruct] { var results: [MyStatusStruct] = [] await withTaskGroup(of: Result<ApiJsonStruct, MyError>.self) { group in for cfg in endpoints { // 明确addTask闭包的返回类型 group.addTask { () -> Result<ApiJsonStruct, MyError> in return await withCheckedContinuation { (continuation: CheckedContinuation<Result<ApiJsonStruct, MyError>, Never>) in self.httpGetInfo(baseUrl: cfg.host) { result in continuation.resume(returning: result) } } } } for await hbResult in group { switch hbResult { case .success(let answer): print("OK.") results.append(.init(status: true)) case .failure(let error): switch error{ case .noConnection(let errUrl): print("No connection.") results.append(.init(status: false)) } } } } return results }
核心说明:
group.addTask的闭包必须明确返回类型Result<ApiJsonStruct, MyError>,让编译器直接匹配withTaskGroup指定的元素类型,消除歧义。- 保留
withCheckedContinuation中continuation的类型注解,确保闭包内部的回调类型与continuation要求一致。
如果不想写完整的闭包返回类型,也可以通过类型别名简化:
typealias ApiResult = Result<ApiJsonStruct, MyError> // 然后在addTask中使用 group.addTask { () -> ApiResult in // ... }
内容的提问来源于stack exchange,提问作者Dimka
相关产品推荐
相关产品推荐

