用于转换Observable的RxSwift运算符&lt; [T]&gt;通过获取第一个元素来观察<t>

时间:2017-01-11 02:30:37

标签: arrays swift rx-swift

目前我这样做:

Observable.just([1, 2, 3, 4])
  .flatMapLatest {
    numbers in
    guard number = numbers.first else {
      return Objservable.empty()
    }
    return Observable.just(number)
  }

是否有更惯用的方式来执行此操作或我可以使用的任何预构建的操作符?

2 个答案:

答案 0 :(得分:2)

您实施它的方式绝对正确。我只是使用flatMap代替flatMapLatest,因为它是一个更通用的运算符,我们不需要flatMapLatest的特殊逻辑。

您可以创建自己的运算符,该运算符适用于Collection类型的observable。

extension Observable where Element : Collection {
  func mapFirst() -> Observable<Element.Iterator.Element> {
    return self.flatMap { elements in
      guard number = numbers.first else {
        return Objservable.empty()
      }
      return Observable.just(number)
    }
  }
}

答案 1 :(得分:1)

您的解决方案非常好,您可以例如。把它转移到扩展中,它会更加通用。 但如果您真的想以其他方式这样做:您可以查看RxOptionals并将其用作:

Observable.just([1, 2, 3, 4])
        .filterEmpty()
        .map { $0.first }
        .filterNil()