Swift
RxSwift

RxSwiftについてようやく理解できてきたのでまとめることにした(3)

Observableの変換基礎 〜filter, map, flatMap〜

3つめの記事です。ここからが本番という感じです!
1つめの記事
2つめの記事

イベントを発生させるObservableですが、これらは変換・合成などができます。この章では基本的な3つの変換、

  • map
  • filter
  • flatMap

について書きます。

filter

let observable: Observable<Int> = Observable.from([1,2,3,4,5])
let filteredObservable: Observable<Int> = observable
    .filter { value in value > 3 }

元のObservableを、onNextで渡された値について、条件がtrueの要素のみからなるObservableに変換します。onCompletedやonErrorはそのまま流します。

上の例の場合は、

onNext(4) -> onNext(5) -> onCompleted()

map

let observable: Observable<Int> = Observable.from([1,2,3,4,5])
let mappedObservable: Observable<Int> = observable
    .map { value in value * 2 }

mapはonNextで流れる値を変換します。onErrorやonCompletedなどはそのまま流します。

上の例の場合は、

onNext(2) -> onNext(4) -> onNext(6) -> onNext(8) -> onNext(10) -> onCompleted()

flatMap

let observable: Observable<Int> = Observable.from([1,2,3,4,5])
let flatMappedObservable: Observable<Int> = observable
    .flatMap { value in Observable.from(0..<value) }

この例だと、onNextで

0, 0, 1, 0, 1, 2, 0, 1, 2, 3, 0, 1, 2, 3, 4

のあとにonCompletedが流れてきます。(本当は順番が違いますが、onNextで流れるそれぞれの値がobservableに変換された後、onNextが連結されます)

flatMapもonNextで流れる値を変換するのは同じですが、返り値がObservableです。そのObservable群のonNextをすべてつなげて、一つのObservableにしています。

これはPromiseなどと似ていて、onNextで流れてきた値ごとにflatMapの中でObservableに変換して、すべてのonNextを結合します。
onCompletdは大元のonCompletedのみが使われます。flatMap内のObservableのonCompletedは無視されますが、即座にcompleteさせるべきです。

オペレータ

こういうObservableを変換するもののことをオペレータと呼びます

以下のように、オペレータによってObservableは変換されていきます。変換の途中でもObservableです。(Elementの型は変わることもあります)
※実際はそれぞれは新しいObservableです。

let barObservable = fooObservable
    .hogeオペレータ
    .fugaオペレータ
    .piyoオペレータ

上に上げたのは最も基礎的なオペレータで、他にも多くのオペレータがあります。また後ろの章で紹介していきます!