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

Swift调用泛型hitService函数提示无法推断闭包参数b类型如何解决

报错原因

你定义的hitService是带泛型约束的函数,泛型T需要满足Codable协议,而Swift编译器无法自动推断泛型T的具体类型:调用函数时你没有给出足够的类型约束,闭包参数b也没有显式声明类型,编译器不知道你需要将接口返回的JSON解析为哪种数据模型,就会触发该类型推断失败的报错。
另外Swift不支持在调用泛型函数时直接通过<类型>的方式指定泛型参数,必须通过上下文的类型约束完成泛型类型推断,所以你之前尝试在尖括号传类型的操作不生效。

解决方法

下面三种方案任选一种即可:

  • 方案1:显式声明闭包参数的类型(最常用)
    假设你需要解析的目标模型是自定义的User类型(需满足Codable协议),直接在闭包中指定参数b的类型:
hitService(urlS: urlStr) { (b: User) in
    // 处理返回的模型数据
}
  • 方案2:通过赋值变量的类型反向推断
    在闭包内将参数b赋值给显式声明类型的变量,编译器可以反向推断出泛型T的类型:
hitService(urlS: urlStr) { b in
    let result: User = b
    // 处理result
}
  • 方案3:修改函数增加显式传类型的入参(可读性最高)
    修改原函数定义,增加入参接收泛型类型,调用时直接传对应类型即可,不需要依赖闭包的类型推断:
// 修改后的函数定义
func hitService<T : Codable>(of type: T.Type, urlS: String , completion : @escaping (T) -> Void) {
    guard let url = URL(string: urlS) else {return}
    let session = URLSession.shared
    let _ = session.dataTask(with: url) { dt, resp, err in
        let decoder = JSONDecoder()
        if let d = dt {
            do {
                let obj = try decoder.decode(T.self, from: d)
                completion(obj)
            } catch {
                print(error.localizedDescription)
            }
        }
    }.resume()
}

// 调用方式
hitService(of: User.self, urlS: urlStr) { b in
    // 处理返回的模型数据
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 00:15:09