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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 03:26:04