【问题标题】:Deriving Publisher from different publishers in Combine从组合中的不同发布者派生发布者
【发布时间】:2021-06-11 14:32:41
【问题描述】:

我有一个固定类型的属性

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&lt;Published&lt;Substatus1&gt;.Publisher, Published&lt;Substatus2&gt;.Publisher&gt;' to return type 'Published&lt;Status&gt;.Publisher'

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

var connectionStatusSubject = PassthroughSubject<Status, Never>()

我放进去

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

这里有新的AnyPublisher,但看起来不是那么整洁。

有什么方法可以让它正确吗?

【问题讨论】:

  • 问题是泛型不是协变的。 Published&lt;Status&gt;Published&lt;Substatus1&gt;Published&lt;Substatus2&gt; 是完全不相关的类型。我建议放弃 substatus 的想法(或通过拥有它来解释你真正想要做什么)。

标签: ios swift xcode combine


【解决方案1】:

Published&lt;T&gt;.Publisher 只是一种特定类型的发布者,由@Published 属性包装器创建。完全没有理由将其用作计算属性的类型。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-07
    • 2020-07-01
    • 1970-01-01
    • 2019-11-30
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多