只是有几个值?

Just with several values?

我想要一个类似于 Just 的 Publisher,除了它应该发出多个值,然后完成流。

我们称它为JustSeveral:

func fibonacci(_ number: Int) -> AnyPublisher<Int, Never> {
  Future { ... }.eraseToAnyPublisher()
}

JustSeveral([293, 18, 104])
  .flatMap { fibonacci([=10=]) }
  .sink { print([=10=]) }

有没有办法将运算符与 Just 结合起来得到同样的东西,或者我需要自己构建这个 Publisher 吗?

注意:任何解决方案都应该能够处理数组中任意数量的元素,而不仅仅是 3 个。


例如,如果我们有一个 ,这将是微不足道的:

Just([293, 18, 104])
  .uncollect { [=11=] }
  .flatMap { fibonacci([=11=]) }
  .sink { print([=11=]) }

更新:你应该使用.


原回答:

一个解决方案是 :

public struct JustSeveral<Value>: Publisher {
  public init(_ outputs: [Value]) {
    self.outputs = outputs
  }

  public var outputs: [Value]

  public typealias Output = Value
  public typealias Failure = Never

  public func receive<Downstream: Subscriber>(subscriber: Downstream) where Downstream.Input == Output, Downstream.Failure == Failure {
    let subject = PassthroughSubject<Value, Never>()
    subject
      .subscribe(subscriber)

    outputs.forEach { subject.send([=10=]) }
    subject.send(completion: .finished)
  }
}

虽然这可行,但我不知道它是否是最佳解决方案,因为它只在订阅时发出值。我不确定 Just 是这样工作的。

导入 Combine 扩展 Array 计算 属性 称为 publisher,returns 一个 Sequence<Array<Int>, Never>,一个 Publisher。所以你可以这样做:

[293, 18, 104]
    .publisher
    .flatMap { fibonacci([=10=]) }
    .sink { print([=10=]) }

但是,Apple 的 API 文档大打折扣,我不认为有一个页面可以记录 Array.publisher