Swift编译报错:无法转换Result<GraphQLResult<具体类型>>为Result<GraphQLResult<Any>>
解决Apollo SDK结果错误处理的泛型适配问题
问题出在Swift泛型的不变性上:Result<GraphQLResult<Any>, Error> 和 Result<GraphQLResult<InviteToCommunityMutation.Data>, Error> 是完全不同的类型——哪怕InviteToCommunityMutation.Data可以转为Any,泛型容器的类型也无法自动兼容。
直接用泛型函数就能解决这个问题,让函数适配任意GraphQLResult的关联类型:
func alertResult<T>(result: Result<GraphQLResult<T>, Error>) { print(result) switch result { case let .failure(error): self.presentAlert(title: "Operation Error", message: "API says: \(error)") case let .success(data): if let errors = data.errors { self.presentAlert(title: "Operation Error", message: "API says: \(errors)") } } }
为什么这个方案可行?
- 泛型参数
T会自动推断为传入的具体类型(比如InviteToCommunityMutation.Data),完美匹配Apollo返回的结果类型 - 不需要强制类型转换,编译器能准确识别
data是GraphQLResult<T>类型,自然可以安全访问data.errors
为什么之前的写法不行?
- 最初的
Result<GraphQLResult<Any>, Error>:Swift泛型默认是不变的,容器类型不支持协变(即不能把Container<Subtype>转为Container<Supertype>),所以无法匹配具体的Mutation结果 - 改成
Result<Any, Error>:Any太宽泛,编译器无法确定里面的内容是GraphQLResult,自然找不到errors属性,必须手动向下转型,既繁琐又不安全
内容的提问来源于stack exchange,提问作者Tom Petit
相关产品推荐
相关产品推荐

