RxSwift — その概要、主要概念、リアクティブプログラミング

著者: IT Sectr 公開日: 2026-03-17 読了時間: 8 分

RxSwiftは、Observableパターンを実装したSwift向けリアクティブプログラミングライブラリです。ReactiveX、2025によると、Appleエコシステム向けのReactive Extensions実装として最も人気があります。Observableはイベントのソースとして機能し、Observerが購読してイベントを受信します。

主要ポイント

  • RxSwift — Observable、Subject、300以上のオペレーターをサポートするSwift向けReactive Extensions実装
  • Observable — 値、エラー、完了シグナルを発行するイベントソース
  • Subject — ObservableとObserverの両方の役割を持ち、ストリームに手動でイベントを挿入可能
  • DisposeBag — 自動メモリ管理メカニズム。デアロケーション時に購読を解除
  • Schedulers — 実行スレッドを管理し、メインキューとバックグラウンドキューを切り替え可能

RxSwiftとは?

RxSwiftは、Swift言語向けのリアクティブプログラミングライブラリで、Reactive Extensions(Rx)から移植されました。Observable Sequence(時間とともに利用可能なデータのシーケンス)を通じて、非同期およびイベント駆動型プログラムを記述できます。iOS開発者は、ネストされたコールバックなしでネットワークリクエスト、UIイベント、ストリーミングデータを処理するためにRxSwiftを使用します。

ObservableとObserver

RxSwiftの基盤は2つの主要プロトコルで構成されています。ObservableTypeは、.next(value)、.error(error)、.completedの3種類のシグナルを発行できるイベントソースです。Observerはsubscribeメソッドを介してObservableを購読し、これらのイベントを受信します。このモデルはReactive Streamsと呼ばれ、適切な購読があればイベントが失われないことを保証します。

変換オペレーター

RxSwiftはストリーム操作のための300以上のオペレーターを提供します。mapは各イベントを変換し、filterは条件に一致するイベントのみを通過させ、flatMapはネストされたObservableを単一のストリームに展開します。オペレーターはチェーン状に連結され、副作用のない宣言的なデータ処理パイプラインを構築します。

Traits: Single、Completable、Maybe

基本的なObservableに加えて、RxSwiftは特殊なラッパー型を提供します。Singleは正確に1つの値またはエラーを発行し、HTTPリクエストに最適です。Completableは値なしで成功または失敗で完了し、書き込み操作に使用します。Maybeは両方のシナリオを組み合わせ、値あり、値なし、エラーのいずれかで完了できます。これらのTraitsはセマンティクスを簡素化し、コードを自己文書化します。

RxSwiftにおけるリアクティブプログラミングの仕組み

RxSwiftのリアクティブプログラミングはObserverパターンに基づいています。ObservableSequenceは標準ライブラリのSequenceに類似していますが、要素への非同期アクセスを提供します。イベントストリームはオペレーターのチェーンを通じて渡され、各オペレーターは元の値を変更せずに新しいObservableSequenceを返します。

オペレーターチェーン

RxSwiftのオペレーターは、1つのObservableSequenceを受け取り新しいものを返す純粋関数です。例えば、mapは各要素に変換を適用して新しいシーケンスを作成します。オペレーターを組み合わせることで、開発者は中間変数なしですべての処理段階をデータが通過するパイプラインを構築します。

Schedulersと実行スレッド

SchedulersはRxSwiftにおける実行スレッドの抽象化です。Schedulerはコードが実行されるスレッドを決定します。MainSchedulerはUIスレッド、SerialDispatchQueueSchedulerはバックグラウンドキューです。subscribeOnとobserveOnオペレーターは、それぞれ作業の実行場所と結果の処理場所を指定します。

RxSwiftの主要コンポーネント

RxSwiftにはいくつかの基本型が含まれており、それぞれがリアクティブパイプラインで独自の役割を果たします。Singleは正確に1つの値またはエラーを発行するObservableで、ネットワークリクエストに便利です。Completableは値なしで成功または失敗で完了します。MaybeはSingleとCompletableの特性を組み合わせます。

SubjectとRelay

SubjectはホットなObservableで、同時にObserverとしても機能します。PublishSubjectは新しいイベントのみを購読者に発行し、BehaviorSubjectは最後のイベントに加えて新しいイベントを発行します。RelayはSubjectの一種で、.errorや.completedを発行せず、ストリームの継続性を保証します。BehaviorRelayは現在の値を保存し、状態駆動型UIに適しています。

DisposeBag

DisposeBagはDisposableのコレクションで、自身のデアロケーション時にすべての購読を自動的に解除します。iOSでは、DisposeBagは通常UIViewControllerまたはUIViewに追加されます。画面が閉じられるとDisposeBagがクリアされ、メモリリークや存在しないUI要素へのアクセスを防止します。

RxSwiftコード例

以下は、mapオペレーターを使用して文字列を変換する、データ配列からのObservable作成例です:

swift
let observable = Observable.of("Swift", "RxSwift", "Reactive")

observable
    .map { $0.uppercased() }
    .subscribe(onNext: { value in
        print("Received: \(value)")
    })
    .disposed(by: disposeBag)

2つ目の例は、zipを使用した2つのネットワークリクエストの結合を示しています。このオペレーターは両方のObservableが値を発行するのを待ち、結果をタプルに結合します:

swift
let first = fetchUser(id: "123")
let second = fetchPosts(userId: "123")

Observable
    .zip(first, second)
    .observe(on: MainScheduler.instance)
    .subscribe(onNext: { user, posts in
        updateUI(user: user, posts: posts)
    })
    .disposed(by: disposeBag)

3つ目の例は、状態を保存し変更時にUIを自動更新するBehaviorRelayの使用法を示しています。各state.accept()の変更は即座に購読者にブロードキャストされ、MVVMアーキテクチャの状態パターンに最適です。

swift
let state = BehaviorRelay(value: "idle")

state
    .subscribe(onNext: { status in
        print("Status: \(status)")
    })
    .disposed(by: disposeBag)

state.accept("loading") // Prints: Status: loading

RxSwiftと他のアプローチの比較

RxSwiftは、従来の非同期手法(Delegation、NotificationCenter、Callback)とは、その宣言的な性質と構成可能性において異なります。Combineとは異なり、RxSwiftはiOS 9+をサポートし、より多くのオペレーターを持ちます。ただし、CombineはFoundationとSwiftUIに言語レベルで統合されており、新しいAppleプロジェクトで優位性を持ちます。

GCD(Grand Central Dispatch)に対するRxSwiftの主な利点は、キューを手動で管理するのではなく、抽象化レベルでデータストリームを結合および変換できることです。ただし、RxSwiftではリアクティブの概念を学ぶ必要があり、チームの参入障壁が高くなります。

実際には、RxSwiftはリアクティブチェーンがUIイベント、ビジネスロジック、ネットワークインタラクションを単一のパイプラインで接続する大規模プロジェクトで使用されます。例えば、トレーディングアプリケーションでは、相場ストリームがRxSwiftを介して処理されます。ティックはWebSocketから到着し、フィルタリングを経て、時間枠ごとにグループ化され、リアルタイムでチャートに表示されます。このシナリオをDelegationやNotificationCenterで可読性を損なわずに実装するのは困難です。

RxSwiftの代替手段には、Combine(iOS 13+)、Swift ConcurrencyのAsyncSequence(iOS 15+)、およびAppleプラットフォームに依存しないサードパーティライブラリ(ReactiveSwiftなど)が含まれます。選択は、最小サポートiOSバージョンと開発者の経験に依存します。新しいiOS 15+プロジェクトでは、チームはしばしばAsyncSequenceを選択します。これはライブラリのインストールが不要で、Swift言語のネイティブ構造を使用します。

RxSwiftを使用したアーキテクチャパターンは、通常MVVMまたはClean Architectureに従います。ViewModelはObservableチェーンとしてすべてのビジネスロジックを含み、Viewは変換されたデータを購読します。Input-Outputパターンは、入力イベント(タップ、テキスト入力)と出力状態(ボタンテキスト、ローダーの可視性)を分離します。このアプローチによりテストが容易になり、ViewModelは仮想Schedulersを通じてUIなしでテストできます。

RxSwiftは、数画面の小規模プロジェクトから数十モジュールの大規模エンタープライズアプリケーションまで適しています。大規模プロジェクトでは、リアクティブチェーンがアーキテクチャ全体に浸透します。RxPropertyを介したUserDefaultsの監視から、Moya(Alamofire上のRxSwiftラッパー)を介したネットワークリクエストまで。各モジュールは分離され、リアクティブインターフェースを介して通信するため、購読者を変更せずに実装を置き換えられます。適切なアーキテクチャでは、RxSwiftは従来のアプローチと比較してコード量を削減します。KVO、Target-Action、NotificationCenterのボイラープレートを記述する必要がないためです。

RxSwiftはRxDataSourcesを使用するプロジェクトで積極的に活用されています。RxDataSourcesは、UITableViewおよびUICollectionViewをリアクティブに操作するためのライブラリです。RxDataSourcesはセルの新旧セット間の差分を自動計算し、アニメーション付きの変更を適用します。これにより、開発者はbeginUpdates/endUpdatesの手動作業から解放され、データ不整合によるクラッシュを排除します。

RxSwiftチェーンのデバッグにはdebug()オペレーターがあります。すべてのイベント(subscribe、next、error、completed、dispose)をログに記録します。複雑なリアクティブパイプラインを開発する際に不可欠なツールです。debug(String)はログに表示される識別子を受け取ります。メモリプロファイリングには、RxSwift.Resources.totalがアプリケーション内のアクティブなObservableとDisposableの総数を表示し、DisposeBagがクリアされていない場合やretain cycleが購読を保持している場合のリーク特定に役立ちます。追加のオペレーターtakeUntil(self.rx.deallocated)は、オブジェクトのデアロケーション時に自動的に購読を解除し、リーク防止のさらなる層を提供します。

RxSwiftのベストプラクティス

RxSwiftコードを作成する際は、購読ごとに単一のObservableの原則に従うことが重要です。各ViewControllerは同じObservableに対して複数の購読を作成すべきではありません。これにより競合状態のリスクが低減します。Observableのメモ化にはshare()オペレーターを使用します。これはコールドObservableをリプレイバッファサイズ1のホットObservableに変換します。共有リソースを操作する場合は、connect()を使用して発行開始を制御し、すべての購読者が最初のイベントの前に接続することを保証します。

RxSwiftコードのテストはTestSchedulerを介して行われます。これは時間を管理できる仮想Schedulerです。testScheduler.createHotObservable(values)は、仮想時間による事前定義されたイベントシーケンスを持つObservableを作成します。testScheduler.start()で処理を開始します。TestSchedulerを使用すると、実際の遅延なしにイベントがどの順序でどの仮想タイムスタンプで発生するかを確認でき、テストを高速かつ決定論的にします。

よくある質問

RxSwiftのObservableとSubjectの違いは何ですか?

Observableはコールドソースで、購読されるまでイベントを発行しません。Subjectはホットで、購読者に関係なくイベントを発行し、onNextを介して手動で値を挿入できます。PublishSubjectは新しいイベントのみを渡し、BehaviorSubjectは最後のイベントと新しいイベントを渡します。

DisposeBagはRxSwiftでメモリリークをどのように防ぎますか?

DisposeBagはすべてのDisposable購読を保存します。DisposeBagがデアロケートされると(例えばViewControllerが閉じられる時)、保存されたすべての購読が自動的に解除されます。これにより、Observableが破棄されたUIオブジェクトにイベントを送信しないことが保証されます。

新しいiOSプロジェクトではRxSwiftとCombineのどちらを選ぶべきですか?

最小iOSバージョンが13+でチームがSwiftUIを知っている場合はCombineを選択してください。プロジェクトがiOS 12以下をサポートする場合やより多くのオペレーターが必要な場合はRxSwiftを選択してください。CombineはFoundation(URLSession、Timer、NotificationCenter)との統合に優れています。

RxSwiftのSchedulersはどのように機能しますか?

Schedulersは実行スレッドを抽象化します。subscribeOnは購読が実行されるSchedulerを指定し(通常はバックグラウンド)、observeOnはイベントが受信されるSchedulerを決定します(多くの場合UI更新用のMainScheduler)。SerialDispatchQueueSchedulerはGCDを介して動作します。

RxSwiftをSwiftUIで使用できますか?

はい、RxSwiftはObservableObjectを介してSwiftUIと統合できます。BehaviorRelayを@Publishedプロパティとして使用します。Relayへの購読はCombineに変更をブロードキャストし、SwiftUIは@ObservedObjectを介してViewを再描画します。これはUIKitからSwiftUIへの移行パターンとして一般的です。

まとめ

  • RxSwift — Reactive ExtensionsとObservableパターンに基づくリアクティブプログラミングライブラリ
  • Observableは.next、.error、.completedの3種類のシグナルを発行する
  • Subject(PublishSubject、BehaviorSubject)はホットストリーム用にObservableとObserverを組み合わせる
  • DisposeBagは購読のライフサイクルを管理しメモリリークを防止する
  • オペレーター(map、filter、flatMap、zip)は宣言的な処理チェーンを構築できる
  • SchedulersはバックグラウンドキューとUIスレッド間で実行を切り替える
  • 新しいiOS 13+開発では、組み込みの代替としてCombineを検討する

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください