LoginSignup
0
1

More than 1 year has passed since last update.

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

Posted at

RxSwiftで使えるオペレーターを備忘録的に書き綴っていきたいと思います。
また、公式Exanpleを参考にしています。
その1はこちら
その2はこちら
その3はこちら
その4はこちら

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

作業環境については、

を参考に構築して頂ければと思います。
早速、やっていきましょう!!

Filtering and Conditional Operators

filter

func filter() {
    let disposeBag = DisposeBag()
    
    Observable.of(
        "🐱", "🐰", "🐶",
        "🐸", "🐱", "🐰",
        "🐹", "🐸", "🐱")
        .filter {
            $0 == "🐱" || $0 == "🐶"
        }
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
}
filter() /*
🐱
🐶
🐱
🐱
*/

.filterで🐱か🐶どちらかがtrueなら出力するようにfilteringしています。
シンプルで解りやすいですね。

distinctUntilChanged

func distinctUntilChanged() {
    let disposeBag = DisposeBag()
    
    Observable.of("🐱", "🐷", "🐱", "🐱", "🐱", "🐵", "🐱")
        .distinctUntilChanged()
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
}
distinctUntilChanged() /*
🐱
🐷
🐱
🐵
🐱
*/

distinctUntilChangedは重複した要素を一つの要素として出力してくれるオペレーターです。

elementAt

func elementAt() {
    let disposeBag = DisposeBag()
    
    Observable.of("🐱", "🐰", "🐶", "🐸", "🐷", "🐵")
        .element(at: 3)
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
}
elementAt() // 🐸

element(at:)で指定した数のObservableのみ出力するオペレーターです。

single

func single() {
    let disposeBag = DisposeBag()
    
    Observable.of("🐱")
        .single()
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
}
single() //🐱

singleは流れてくる最初の値、または指定した引数の値のみ流します。
その値が複数ある場合はerrorが流れます。

func single() {
    let disposeBag = DisposeBag()
    
    Observable.of("🐱", "🐰", "🐶", "🐸", "🐷", "🐵")
        .single { $0 == "🐸" }// 🐸が1つなので正常に流れます
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
    
    Observable.of("🐱", "🐰", "🐶", "🐱", "🐰", "🐶")
        .single { $0 == "🐰" }// 🐱が2つあるので、2つ目の出力時にerrorが出ます
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
    
    Observable.of("🐱", "🐰", "🐶", "🐸", "🐷", "🐵")
        .single { $0 == "🔵" }// 🔵が無いので、errorがでます
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
}
single() /*
🐸
🐰
Unhandled error happened: Sequence contains more than one element.
Unhandled error happened: Sequence doesn't contain any elements.
*/

take

func take() {
    let disposeBag = DisposeBag()
    
    Observable.of("🐱", "🐰", "🐶", "🐸", "🐷", "🐵")
        .take(3)
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
}
take() /*
🐱
🐰
🐶
*/

**take()**で指定した値まで出力してくれるオペレーターです。

takeLast

func takeLast() {
    let disposeBag = DisposeBag()
    
    Observable.of("🐱", "🐰", "🐶", "🐸", "🐷", "🐵")
        .takeLast(3)
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
}
takeLast() /*
🐸
🐷
🐵
*/

takeLastはtakeLast()で指定した値が最後から数えたObservableから流してくれるオペレーターです。

takeWhile

func takeWhile() {
    let disposeBag = DisposeBag()
    
    Observable.of(1, 2, 3, 4, 5, 6)
        .take(while: { $0 < 4 })
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
}
takeWhile() /*
1
2
3
*/

takeWhileはtake(while:)で指定した値がtrueである限り、イベントを流してくれるオペレーターです。

takeUntil

func takeUntil() {
    let disposeBag = DisposeBag()
    
    let sourceSequence = PublishSubject<String>()
    let referenceSequence = PublishSubject<String>()
    
    sourceSequence
        .take(until: referenceSequence)
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
    
    sourceSequence.onNext("🐱")
    sourceSequence.onNext("🐰")
    sourceSequence.onNext("🐶")
    
    referenceSequence.onNext("🔴")// 引数に指定したreferenceSequenceに値が流れたので、これ以降の値が流れない
    
    sourceSequence.onNext("🐸")
    sourceSequence.onNext("🐷")
    sourceSequence.onNext("🐵")
}
takeUntil() /*
🐱
🐰
🐶
*/

takeUntilはtake(until:)で指定した値が流れるまではイベントを流してくれるオペレーターになります。

skip

func skip() {
    let disposeBag = DisposeBag()
    
    Observable.of("🐱", "🐰", "🐶", "🐸", "🐷", "🐵")
        .skip(2)// 最初の値から2つ分飛ばして(スキップして)出力している
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
}
skip() /*
🐶
🐸
🐷
🐵
*/

skipはskip()の引数に指定した値分飛ばして、そこからイベントを発行できるオペレーターです。

skipWhile

func skipWhile() {
    let disposeBag = DisposeBag()

    Observable.of(1, 2, 3, 4, 5, 6)
        .skip(while: { $0 < 4 })
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
}
skipWhile() /*
4
5
6
*/

skipWhileはskip(while:)で指定した値がtrueである限り、指定した値を飛ばしてくれるオペレーターです。

skipWhileWithIndex

func skipWhileWithIndex() {
    let disposeBag = DisposeBag()
    
    Observable.of("🐱", "🐰", "🐶", "🐸", "🐷", "🐵")
        .enumerated()// StringのObservableにそれぞれindex番号を付けています
        .skip (while: { $0.index < 3 })
        // .map { $0.element }  各elementのみの出力に変換している
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
}
skipWhileWithIndex() /*
(index: 3, element: "🐸")
(index: 4, element: "🐷")
(index: 5, element: "🐵")
*/

skipWhileIndexは指定したindex番号分飛ばして(スキップして)値を出力しています

skipUntil

func skipUntil() {
    let disposeBag = DisposeBag()
    
    let sourceSequence = PublishSubject<String>()
    let referenceSequence = PublishSubject<String>()
    
    sourceSequence
        .skip(until: referenceSequence)
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
    
    sourceSequence.onNext("🐱")
    sourceSequence.onNext("🐰")
    sourceSequence.onNext("🐶")
    
    referenceSequence.onNext("🔴")
    
    sourceSequence.onNext("🐸")
    sourceSequence.onNext("🐷")
    sourceSequence.onNext("🐵")
}
skipUntil() /*
🐸
🐷
🐵
*/

takeUntilの逆転の出力ですね!!
referenceSequenceにイベントが流れるまで出力を飛ばし続けるオペレーターになります。

続きは次回に

RxSwiftのオペレーターもこれで半分程学習してきました😀
引き続きオペレーター学習を行い、より良いコードが書ける様に頑張っていきます!!
以上です🥹

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1