如何将发布者转换为 CurrentValueSubject?

How to convert a publisher to a CurrentValueSubject?

我有一个发布者订阅了我的 onReceive 观点。我希望 onReceive 中的发布者在第一次订阅时触发,而不是在 onAppear 中复制逻辑。

有没有办法将发布者转换为 CurrentValueSubject?这是我正在尝试做的事情:

var myPublisher: CurrentValueSubject<Void, Never> {
    Just(()) // Error: Cannot convert return expression of type 'Just<()>' to return type 'CurrentValueSubject<Void, Never>'
}

这是可行的还是更好的方法?

您不能随意将发布商转换为 CurrentValueSubject,因为它是一种非常特殊的发布商类型。问问自己是否真的需要 myPublisher 的类型是 CurrentValueSubject<Void, Never> 或者 AnyPublisher<Void, Never> 是否可以。

var myPublisher: AnyPublisher <Void, Never> {
    Just(()).eraseToAnyPublisher()
}

或者,如果您想要做的只是创建一个 CurrentValueSubject 的实例,它的初始值是 () 您可以使用这个:

var myPublisher: CurrentValueSubject<Void, Never> {
    CurrentValueSubject<Void, Never>(())
}

您可以将发布者分配给 CurrentValueSubject,然后您可以在您的代码中使用它。不重复逻辑。

var oldPublisher: AnyPublisher <Void, Never>
    
private var cancellables = Set<AnyCancellable>()
    
var myCurrentValueSubject: CurrentValueSubject<Void, Never> {
    let subject = CurrentValueSubject<Void, Never>(())
    oldPublisher
      .assign(to: \.value, on: subject)
      .store(in: &cancellables)
    return subject
}