【Swift】RxSwiftのPlaygroundを読む①

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

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

今回は[Creating_and_Subscribing_to_Observables](https://github.com/ReactiveX/RxSwift/blob/master/Rx.playground/Pages/Creating_and_Subscribing_to_Observables.xcplaygroundpage/Contents.swift)です。

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

# 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。

```swift
let disposeBag = DisposeBag()

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

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

**結果**

```

```

## empty
completeだけが発生するObservable。

```swift
let disposeBag = DisposeBag()

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

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

**結果**

```
Completed
```

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

```swift
let disposeBag = DisposeBag()

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

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

**結果**

```
Next(🍑)
Completed
```

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

```swift
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に対して行う。

```swift
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。

```swift
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。

```swift
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などと一緒に使用。

```swift
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。

```swift
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。

```swift
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を覗き見したいとき。)

```swift
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