Combine中能否将AnyPublisher<Int,Never>转换为Published<Int>.Publisher?
关于Combine中AnyPublisher转Published.Publisher的问题
嘿,这个问题问到点子上了——直接把AnyPublisher<Int, Never>转换成Published<Int>.Publisher是做不到的,原因很简单:Published<Int>.Publisher是@Published属性专属的内部关联类型,它和属性的存储逻辑绑定在一起,并没有公开的初始化方法来接收外部的任意Publisher。
简单说,只有当你定义了@Published var someValue: Int这样的属性时,通过$someValue拿到的才是Published<Int>.Publisher,这个类型没办法凭空从外部Publisher直接转换出来。
不过别担心,我们可以用一个中转的@Published属性来实现类似的效果,把外部Publisher的值同步到这个属性上,然后就能拿到对应的Published.Publisher了。看下面的代码示例:
import Combine class ExampleViewModel { // 外部传入的任意Publisher private let externalIntPublisher: AnyPublisher<Int, Never> // 中转用的@Published属性 @Published var syncedValue: Int = 0 private var cancellables = Set<AnyCancellable>() init(externalPublisher: AnyPublisher<Int, Never>) { self.externalIntPublisher = externalPublisher // 把外部Publisher的值同步到@Published属性 externalIntPublisher .assign(to: \.syncedValue, on: self) .store(in: &cancellables) } // 这里返回的就是你需要的Published<Int>.Publisher类型 var targetPublisher: Published<Int>.Publisher { $syncedValue } }
关键说明:
- 当外部的
AnyPublisher发送新的Int值时,assign(to:on:)会自动更新syncedValue,而$syncedValue就是你需要的Published<Int>.Publisher - 一定要用
cancellables存储订阅对象,避免内存泄漏或者订阅提前失效 - 如果外部Publisher会发送多个值,这个中转方案会实时同步所有更新到
@Published属性上
内容的提问来源于stack exchange,提问作者Kevin ABRIOUX
相关产品推荐
相关产品推荐

