Swift调用泛型网络请求报错:无法推断泛型参数T如何解决?
错误原因
你的代码报错的核心是Swift中协议本身不遵循自身,哪怕LoginInfoBase继承了Decodable,LoginInfoBase.Type这个协议类型也不能作为满足T: Decodable约束的泛型参数传入genericQuery,泛型需要的是具体的遵循协议的类型,而不是协议本身的类型。
修复方案
将getLoginInfo改造为泛型方法,给泛型参数添加LoginInfoBase约束即可:
public func getLoginInfo<T: LoginInfoBase>(loginInfoClass: T.Type, completionHandler: @escaping (Swift.Result<T, Error>) -> Void) { genericQuery(urlString: "\(baseURL)/users/get_login_info/", method: .get, params: nil, decodable: loginInfoClass.self) { result in // 原有逻辑无需修改,直接透传result即可 completionHandler(result) } }
调用说明
原有调用代码不需要做任何改动:
getLoginInfo(loginInfoClass: ExampleLoginInfo.self) { result in // 此时result的成功值就是ExampleLoginInfo类型,可以直接访问自定义扩展的user_info、more_example_data等字段 <more code here> }
实现效果
修改后既满足通用登录库的要求:任意遵循LoginInfoBase协议的自定义用户数据类都可以传入,也能保证解码后的实例是传入的具体类类型,完整保留接入方自定义的扩展字段。
内容的提问来源于stack exchange,提问作者Dylan
相关产品推荐
相关产品推荐

