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
相关产品推荐
相关产品推荐

