Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

【Swift】RxSwiftのPlaygroundを読む①

More than 3 years have passed since last update.

リアクティブを理解するために、
RxSwiftのPlaygroundが大変有用なことにやっと気づいたので、
Playgroundを読んで理解したことをまとめていきたいと思います。
(他にオススメのものありましたら教えて下さい。)

"川"という表現がありますが、
理解が進めば進むほど的を得た表現であることがわかったので、
適宜川的表現を使っていきたいと思います。

今回はCreating_and_Subscribing_to_Observablesです。

理解が浅いため間違い等ありましたらご指摘願います。

Observable

Observableは川です。
event(next, complete, errorのどれか)が流れてきます。
nextは何度も流れてきますが、completeかerrorのどちらか(両方はない)が流れてくると、
その川は枯れます(もうeventが流れてこない)。
Observableをsubscribeする(川を観察する)とeventが流れてくるので、
流れてくるeventに合わせて反応します。

Observableはsubscribeされたタイミングでeventが発生します。
(subscribeされていなくてもeventを発生できるSubjectTypeについては次回。)

never

event(next, complete, error)が一切発生しないObservable。

let disposeBag = DisposeBag()

let never川 = Observable<Void>
    .never()

never川
    .subscribe { print("never be called.") }
    .addDisposableTo(disposeBag)

結果

empty

completeだけが発生するObservable。

let disposeBag = DisposeBag()

let empty川 = Observable<Void>
    .empty()

empty川
    .subscribe { print($0) }
    .addDisposableTo(disposeBag)

結果

Completed

just

最初に指定したnextが一度発生して、completeするObservable。

let disposeBag = DisposeBag()

let just川 = Observable<String>
    .just("🍑")

just川
    .subscribe { print($0) }
    .addDisposableTo(disposeBag)

結果

Next(🍑)
Completed

of

最初に指定した複数のnextが順に発生して、completeするObservable。

let disposeBag = DisposeBag()

let of川 = Observable<String>
    .of("🍑1", "🍑2", "🍑3", "🍑4")

of川
    .subscribe { print($0) }
    .addDisposableTo(disposeBag)

結果

Next(🍑1)
Next(🍑2)
Next(🍑3)
Next(🍑4)
Completed

toObservable

SequenceType(Array, Dictionary, Set等)の要素を順にeventとして発生させ、
最後にcompleteするObservable。
ofと同様の動作をSequenceTypeに対して行う。

let disposeBag = DisposeBag()

let toObservable川 = ["🍑1", "🍑2", "🍑3", "🍑4"]
    .toObservable()

toObservable川
    .subscribe { print($0) }
    .addDisposableTo(disposeBag)

結果

Next(🍑1)
Next(🍑2)
Next(🍑3)
Next(🍑4)
Completed

create

eventを任意に発生させることができるObservable。

let disposeBag = DisposeBag()

let create川 = Observable<String>
    .create { observer -> Disposable in

        observer.onNext("🍑🍑")
        observer.onCompleted()

        return NopDisposable.instance
    }

create川
    .subscribe { print($0) }
    .addDisposableTo(disposeBag)

結果

Next(🍑🍑)
Completed

range

Int型(SignedIntegerTypeプロトコル)の初期値から、
count数分のeventを発生し、completeするObservable。

let disposeBag = DisposeBag()

let range川 = Observable
    .range(start: 0, count: 10)

range川
    .subscribe { print($0) }
    .addDisposableTo(disposeBag)

実行結果

Next(0)
Next(1)
Next(2)
Next(3)
Next(4)
Next(5)
Next(6)
Next(7)
Next(8)
Next(9)
Completed

repeatElement

指定した値のeventを無限に発生し続けるObservable。
takeなどと一緒に使用。

let disposeBag = DisposeBag()

let repeatElement川 = Observable<String>
    .repeatElement("🍑")
    .take(3) // 3つだけにする

repeatElement川
    .subscribe { print($0) }
    .addDisposableTo(disposeBag)

結果

Next(🍑)
Next(🍑)
Next(🍑)
Completed

generate

Cのfor-loopのように、初期値・条件・ループ後の操作、を指定し、
条件を満たす間nextを発生させ、最後にcompleteするObservable。

let disposeBag = DisposeBag()

let generate川 = Observable<Int>
    .generate(
        initialState: 0,
        condition   : { $0 < 3 },
        iterate     : { $0 + 1 }
    )

generate川
    .subscribe { print($0) }
    .addDisposableTo(disposeBag)

結果

Next(0)
Next(1)
Next(2)
Completed

[WIP]deferred

subscribeする度に新しいObservableを作成するObservable。

とのことですが、つまりどういうことなのか、
サンプルコードを見ても理解できなかったので、
書けるまで理解したら追記します。
どなたか教えてください(汗)。

error

指定したerrorだけを発生させるObservable。

extension String: ErrorType {}

let disposeBag = DisposeBag()

let error川 = Observable<Int>
    .error("an error occured.")

error川
    .subscribe { print($0) }
    .addDisposableTo(disposeBag)

結果

Error(an error occurred.)

doOn

副作用を起こしたい時に利用するObservable。
(eventを覗き見したいとき。)

let disposeBag = DisposeBag()

let doOn川 = Observable
    .of("🍑", "🍑", "🍑", "🍑")
    .doOn { print("Intercepted: ", $0) }

doOn川
    .subscribe { print($0) }
    .addDisposableTo(disposeBag)

結果

Intercepted:  Next(🍑)
Next(🍑)
Intercepted:  Next(🍑)
Next(🍑)
Intercepted:  Next(🍑)
Next(🍑)
Intercepted:  Next(🍑)
Next(🍑)
Intercepted:  Completed
Completed

終わりに

今回はObservablenの作り方について触れました。
次回はObservableの機能を持ちつつも、
好きな時にeventを発生させることのできる
SubjectTypeについて書きたいと思います。

参考

https://github.com/ReactiveX/RxSwift/tree/master/Rx.playground

KentaKudo
イギリスの会社でソフトウェアエンジニアをしています。
https://kentakudo.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away