Swift报错Apollo.Cancellable不符合Combine.Cancellable如何解决
报错根因
这是跨模块同名类型冲突导致的编译错误:
你的代码文件里同时导入了Combine和Apollo两个框架,两个框架下都定义了名为Cancellable的类型:
- 你声明属性时写的
private var subscription: Cancellable?没有指定命名空间,编译器会默认将其解析为Combine.Cancellable - Apollo的
subscribe订阅方法返回值是Apollo SDK自有的Apollo.Cancellable
两个类型完全不兼容,因此赋值时会抛出类型不匹配的错误。
修复方法
根据你的使用场景二选一即可:
不需要对接Combine生命周期管理:显式指定属性的命名空间
直接修改属性声明,明确类型为Apollo下的Cancellable即可,原有订阅逻辑不需要改动:import Apollo // 显式标注类型所属的命名空间,避免编译器误判为Combine类型 private var subscription: Apollo.Cancellable?需要对接Combine的Cancellable生命周期管理(比如要存入
Set<AnyCancellable>自动销毁):
不要直接用闭包形式的订阅方法,改用Apollo提供的Combine扩展接口返回Publisher,再走Combine的订阅逻辑:import Apollo import Combine private var cancellables = Set<AnyCancellable>() // 订阅逻辑 ApolloNetwork.shared.apollo .subscribe(subscription: UserBalanceSubscription()) .sink( receiveCompletion: { completion in guard case .failure(let err) = completion else { return } print("subscription error: \(err)") }, receiveValue: { graphQLResult in print(graphQLResult) } ) .store(in: &cancellables)注意使用该方式需要确保项目已经引入Apollo对应的Combine支持组件,新版Apollo SDK默认内置该扩展,旧版本需要额外引入
ApolloCombine相关依赖。
避坑提示:只要文件中同时导入Apollo和Combine,不带命名空间前缀的
Cancellable都会被优先解析为Combine框架下的类型,涉及Apollo返回的取消令牌时,都建议显式加Apollo.前缀做类型明确。
内容的提问来源于stack exchange,提问作者SadDeveloper
相关产品推荐
相关产品推荐

