RxSwift基礎-オペレーターその2

# はじめに
RxSwiftで使えるオペレーターを備忘録的に書き綴っていきたいと思います。前回は[こちら](https://qiita.com/masasumi0327/items/ef3d2cf4d014414f42d5)
また、公式Exanpleを参考にしています。


https://github.com/ReactiveX/RxSwift

動画でRxSwiftを**非常に解りやすく**紹介していた

https://www.youtube.com/watch?v=sJbvQByQYlc

も参考にしています。是非見て頂きたいです。

作業環境については、

https://qiita.com/masasumi0327/items/2ae144160987e571bce4

を参考に構築して頂ければと思います。
早速、やっていきましょう!!
## Subject
Observable(送信)とObserver(受信)の両方として機能します。
ざっくり言うと、便利でなんでも出来そうです!!
RxSwiftはなんでも出来すぎて、どうしていいか解らなくなります。😂
### publishSubject
```swift
func publishSubject() {
    
    let disposeBag = DisposeBag()
    
    let subject = PublishSubject<String>()
    // Observer1購読
    subject
        .subscribe(onNext: { element in
            print("Subscription: 1 Event: \(element)")
        })
        .disposed(by: disposeBag)
    
    subject.onNext("🐶")
    subject.onNext("🐱")
    // Observer2購読
    subject
        .subscribe(onNext: { element in
            print("Subscription: 2 Event: \(element)")
        })
        .disposed(by: disposeBag)
    
    subject.onNext("🅰️")
    subject.onNext("🅱️")
}

publishSubject() /*
Subscription: 1 Event: 🐶
Subscription: 1 Event: 🐱
Subscription: 1 Event: 🅰️
Subscription: 2 Event: 🅰️
Subscription: 1 Event: 🅱️
Subscription: 2 Event: 🅱️
*/
```
subscribe(購読)した直後にonNextの値が流れます。
PublishSubjectは素直に順に購読されていきます。
subscribeが2回流れた時には、1回目のイベント🅰️→２回目のイベント🅰️が流れ、1回目のイベント🅱️→2回目のイベント🅱️という流れになります。
Subjectの中では一番処理がとらえやすいです。
### ReplaySubject
```swift
func replaySubject() {
    
    let disposeBag = DisposeBag()
    
    let subject = ReplaySubject<String>.create(bufferSize: 2)
    // Observer1購読
    subject
        .subscribe(onNext: { element in
            print("Subscription: 1 Event: \(element)")
        })
        .disposed(by: disposeBag)
   
    subject.onNext("🐶")
    subject.onNext("🐱")
    // Observer2購読
    subject
        .subscribe(onNext: { element in
            print("Subscription: 2 Event: \(element)")
        })
        .disposed(by: disposeBag)
    
    subject.onNext("🅰️")
    subject.onNext("🅱️")
}
replaySubject() /* 
Subscription: 1 Event: 🐶
Subscription: 1 Event: 🐱
Subscription: 2 Event: 🐶
Subscription: 2 Event: 🐱
Subscription: 1 Event: 🅰️
Subscription: 2 Event: 🅰️
Subscription: 1 Event: 🅱️
Subscription: 2 Event: 🅱️
/*
```
先ほどのPublishSubjectと出力が変わっています。
これは、subscribeされた直後に引数で指定したbufferSizeの数前の値を流しているからです。
2回目のsubscribe→指定したbufferSize2前の値 = 🐶から値を流していますね。

また、bufferSizeが指定した値が存在しない場合、一番古い値から流していきます。
(サンプルコードの値を3以上に設定して頂くと解りやすいです)
### BehaviorSubject
```swift
func behaviorSubject() {
    
    let disposeBag = DisposeBag()
    
    let subject = BehaviorSubject<String>(value:"🔴")
    // Observer1購読
    subject
        .subscribe(onNext: { element in
            print("Subscription: 1 Event: \(element)")
        })
        .disposed(by: disposeBag)
   
    subject.onNext("🐶")
    subject.onNext("🐱")
    // Observer2購読
    subject
        .subscribe(onNext: { element in
            print("Subscription: 2 Event: \(element)")
        })
        .disposed(by: disposeBag)
    
    subject.onNext("🅰️")
    subject.onNext("🅱️")
    // Observer3購読
    subject
        .subscribe(onNext: { element in
            print("Subscription: 3 Event: \(element)")
        })
        .disposed(by: disposeBag)
    
    subject.onNext("🍐")
    subject.onNext("🍊")
}
behaviorSubject() /*
Subscription: 1 Event: 🔴
Subscription: 1 Event: 🐶
Subscription: 1 Event: 🐱
Subscription: 2 Event: 🐱
Subscription: 1 Event: 🅰️
Subscription: 2 Event: 🅰️
Subscription: 1 Event: 🅱️
Subscription: 2 Event: 🅱️
Subscription: 3 Event: 🅱️
Subscription: 1 Event: 🍐
Subscription: 2 Event: 🍐
Subscription: 3 Event: 🍐
Subscription: 1 Event: 🍊
Subscription: 2 Event: 🍊
Subscription: 3 Event: 🍊
/*
```
PublishSubjectと比べると、BehaviorSubjectは初期値を持っています。(value:"🔴")
なので、最初にsubscribeする際には、必ず初期値が流れます。
その後の処理では、ひとつ前の値(Observar2がsubscriveされた時、ひとつ前の値🐱がまず流れていますね)
### AsyncSubject
```swift
func asyncSubject() {
    
    let disposeBag = DisposeBag()
    
    let subject = AsyncSubject<String>()
    // Observer1購読
    subject
        .subscribe(onNext: { element in
            print("Subscription: 1 Event: \(element)")
        })
        .disposed(by: disposeBag)
   
    subject.onNext("🐶")
    subject.onNext("🐱")
    // Observer2購読
    subject
        .subscribe(onNext: { element in
            print("Subscription: 2 Event: \(element)")
        })
        .disposed(by: disposeBag)
    
    subject.onNext("🅰️")
    subject.onNext("🅱️")
    subject.onCompleted()
}
asyncSubject() /*
Subscription: 1 Event: 🅱️
Subscription: 2 Event: 🅱️
/*
```
AsyncSubjectはonCompleted()が呼ばれた時に直前の値を流すSubjectになります。

以上Subjectの解説でした。
引き続き、オペレーターの勉強を続けていきます!!