从 Combine 中的不同发布者派生发布者

Deriving Publisher from different publishers in Combine

我有一个固定类型的属性

var statusPublisher: Published<Status>.Publisher

和其他一些状态,例如 substatus1substatus2

我希望它结合其他状态的值,例如

var statusPublisher: Published<Status>.Publisher {
    $substatus1.combineLatest($substatus2).map { s1, s2 -> Status in ... }
}

但是它说 Cannot convert return expression of type 'Publishers.CombineLatest<Published<Substatus1>.Publisher, Published<Substatus2>.Publisher>' to return type 'Published<Status>.Publisher'

我设法用一个额外的方法解决了这个问题

var connectionStatusSubject = PassthroughSubject<Status, Never>()

我放入

var connectionStatusPublisher: AnyPublisher<Status, Never> {
    connectionStatusSubject.eraseToAnyPublisher()
}

这里有新的AnyPublisher,但好像不太整齐。

有什么方法可以让它变成正确的方式吗?

Published<T>.Publisher 只是一种特定类型的发布者,由 @Published 属性 包装器创建。根本没有理由将其用作计算 属性.

的类型

类型擦除到 AnyPublisher - 就像你对 PassthroughSubject 做的那样 - 除了你不需要 PassthroughSubject:

var statusPublisher: AnyPublisher<Status, Never> {
    $substatus1
       .combineLatest($substatus2)
       .map { s1, s2 -> Status in ... }
       .eraseToAnyPublisher()
}