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

RxSwiftで使えるオペレーターを備忘録的に書き綴っていきたいと思います。
また、公式Exanpleを参考にしています。
その1は[こちら](https://qiita.com/masasumi0327/items/ef3d2cf4d014414f42d5)
その2は[こちら](https://qiita.com/masasumi0327/items/c5f2c57420235cb58a5e)
その3は[こちら](https://qiita.com/masasumi0327/items/9bf2ad48f2c6a7183dae)
その4は[こちら](https://qiita.com/masasumi0327/items/fb0f250ab65f6cf5c416)
その5は[こちら](https://qiita.com/masasumi0327/items/62ddabf3732052cf7774)
その6は[こちら](https://qiita.com/masasumi0327/items/7c448dc90f475ae453db)


https://github.com/ReactiveX/RxSwift

また、今回の内容はこちらの動画が非常に解りやすいです。

https://www.youtube.com/watch?v=eP7e8MLz1qI&t=617s


作業環境については、

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

を参考に構築して頂ければと思います。
早速、やっていきましょう!!
また、個人的にRxExanpleのサンプルコードは解りづらく感じましたので、自分なりにコードを書いてました😀
# Error Handling Operators
RxExampleの流れでいくと**Connectable Operators**なのですが、説明出来るほど自身が理解出来ていないので、一旦飛ばしていますので、ご了承ください🙇‍♂️
### catchAndReturn
```swift
public enum TestError: Swift.Error {
    case test
}

func catchAndReturn() {
    let disposeBag = DisposeBag()
    
    let sequenceThatFails = PublishSubject<String>()
    
    sequenceThatFails
        .catchAndReturn("😊")
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
    
    sequenceThatFails.onNext("😬")
    sequenceThatFails.onNext("😨")
    sequenceThatFails.onNext("😡")
    sequenceThatFails.onNext("🔴")
    sequenceThatFails.onError(TestError.test)
}
catchAndReturn() /*
😬
😨
😡
🔴
😊
*/
```
**catchAndReturn**はerrorが出力された際に、errorの代わりにcatchAndReturn()の引数に指定した値を流すオペレーターになります。
### catch
```swift
func `catch`() {
    let disposeBag = DisposeBag()
    
    let sequenceThatFails = PublishSubject<String>()
    let recoverySequence = PublishSubject<String>()
    
    sequenceThatFails
        .catch {
            print("Error:", $0) // errorが流れた時
            return recoverySequence // recoverySequenceに切り替える
        }
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
    
    sequenceThatFails.onNext("😬")
    sequenceThatFails.onNext("😨")
    sequenceThatFails.onNext("😡")
    sequenceThatFails.onNext("🔴")
    sequenceThatFails.onError(TestError.test)
    
    sequenceThatFails.onNext("😍") // recoverySequenceのイベントしか値が流れません
    
    recoverySequence.onNext("😊")
}
`catch`() /*
😬
😨
😡
🔴
Error: test
😊
*/
```
**catch**は、Errorが流れた時に別の出力に切り替える事が出来るオペレーターです。
### retry, debug
```swift
public enum TestError: Swift.Error {
    case test
}

func retry() {
    let disposeBag = DisposeBag()
    var count = 1
    
    let sequenceThatErrors = Observable<String>.create { observer in
        observer.onNext("🍎")
        observer.onNext("🍐")
        observer.onNext("🍊")
        
        if count < 3 {
            observer.onError(TestError.test)
            print("Error encountered")
            count += 1
        }
        
        observer.onNext("🐶")
        observer.onNext("🐱")
        observer.onNext("🐭")
        observer.onCompleted()
        
        return Disposables.create()
    }
    
    sequenceThatErrors
 //       .debug()
        .retry(3)
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
}
retry() /*
🍎 //count = 1
🍐
🍊
Error encountered
🍎 // count = 2
🍐
🍊
Error encountered
🍎 // count = 3 なのでerrorが流れない
🍐
🍊
🐶
🐱
🐭
*/
```
**retry**はerrorが流れた時に、retryで指定した整数分、イベントを流し続けるオペレーターです。
今回のサンプルコードでは、変数countが3未満だとerrorが出るObservarを作成して、それに対してretry(3)を指定してsubscribeしていますね。
なのでcount=3の時には正常に値が全て流れます。

また、**debug()** をコメントインしてビルドして頂くと、次のような出力になります。
```
2022-07-29 15:11:09.961: MyPlayground.playground:31 (retry()) -> subscribed
2022-07-29 15:11:09.962: MyPlayground.playground:31 (retry()) -> Event next(🍎)
🍎
2022-07-29 15:11:09.970: MyPlayground.playground:31 (retry()) -> Event next(🍐)
🍐
2022-07-29 15:11:09.970: MyPlayground.playground:31 (retry()) -> Event next(🍊)
🍊
2022-07-29 15:11:09.971: MyPlayground.playground:31 (retry()) -> Event error(test)
2022-07-29 15:11:09.971: MyPlayground.playground:31 (retry()) -> isDisposed
Error encountered
2022-07-29 15:11:09.972: MyPlayground.playground:31 (retry()) -> subscribed
2022-07-29 15:11:09.972: MyPlayground.playground:31 (retry()) -> Event next(🍎)
🍎
2022-07-29 15:11:09.972: MyPlayground.playground:31 (retry()) -> Event next(🍐)
🍐
2022-07-29 15:11:09.972: MyPlayground.playground:31 (retry()) -> Event next(🍊)
🍊
2022-07-29 15:11:09.972: MyPlayground.playground:31 (retry()) -> Event error(test)
2022-07-29 15:11:09.972: MyPlayground.playground:31 (retry()) -> isDisposed
Error encountered
2022-07-29 15:11:09.972: MyPlayground.playground:31 (retry()) -> subscribed
2022-07-29 15:11:09.972: MyPlayground.playground:31 (retry()) -> Event next(🍎)
🍎
2022-07-29 15:11:09.972: MyPlayground.playground:31 (retry()) -> Event next(🍐)
🍐
2022-07-29 15:11:09.972: MyPlayground.playground:31 (retry()) -> Event next(🍊)
🍊
2022-07-29 15:11:09.972: MyPlayground.playground:31 (retry()) -> Event next(🐶)
🐶
2022-07-29 15:11:09.979: MyPlayground.playground:31 (retry()) -> Event next(🐱)
🐱
2022-07-29 15:11:09.979: MyPlayground.playground:31 (retry()) -> Event next(🐭)
🐭
2022-07-29 15:11:09.979: MyPlayground.playground:31 (retry()) -> Event completed
2022-07-29 15:11:09.979: MyPlayground.playground:31 (retry()) -> isDisposed
```
このように、処理の流れがひと目で解るオペレーターになります。debug()を駆使しながら、他のオペレーターの動きを見ていくと、更に理解が深まりそうですね😆

# おわりに
以上でRxExampleのオペレーター紹介は終わりです😭
早く使いこなせるように引き続き学習していきたいと思います。
お疲れ様でした。🙇‍♂️