🌊

RxSwiftを試すための環境を作成する

2022/05/02に公開

はじめに

BOOTHで公開してあるRxSwift研究読本の本文中にあるコードなど、小さなコードを試すための方法を書いておきます。RxSwift研究読本シリーズ中で3や4などはコード量が多いためそれぞれサンプルコードのリポジトリを用意していますが、小さなコードを軽く試すための方法がわからない方向けに書いています。

RxSwiftを試すための方法

いくつか方法はあるのですが、ここで説明するのは次の2つです。

  • RxSwift自体が提供してくれているPlaygroundsを利用する
    • 小さなコードを書く場合
  • RxSwiftをXcodeのSwift Packageで導入する
    • テストコードを利用する場合

方法1: RxSwift自体が提供してくれているPlaygroundsを利用する

  • GitHubからあなたのmacにリポジトリをcloneします
    • $ git clone git@github.com:ReactiveX/RxSwift.git
  • Xcodeでワークスペースを開きます
    • $ open Rx.xcworkspace
  • RxExampleからPlaygroundを開きます
    • RxExample > Rx.playground > TryYourself
  • まずライブラリをビルドするためPlaygroundにあるNoteに書かれてる通りにします
    • 1. Open Rx.xcworkspace.(手順通りならすでに開いているので必要なし)
    • 2. Build the RxExample-macOS scheme (Product → Build).
    • 3. Open Rx playground in the Project navigator (under RxExample project).
    • 4. Show the Debug Area (View → Debug Area → Show Debug Area).

これでPlaygroundとして動作するようになれば準備完了です。
example("Try yourself") { ... }のなかに好きにコードを書いてもよし、新たにご自身でexample("キャンセルするサンプル") {}などを用意しても自由です。

蛇足: RxSwift自体のRxExample

RxExampleには様々なサンプルコードがあるので、Playgroundsだけでなくサンプルコードを動かして得られることも多いはずです。ローカルにcloneしているためRxSwift自体のコードを変更することも容易なため、print関数を仕込んでログを出力して動作を観察するということもできます。

念の為書いておきますが、RxSwiftリポジトリをcloneしたローカル環境でgit push originをしても、あなたには権限がないためにGitHubのRxSwiftリポジトリ本体にコミットをpushできません(もしあなたがpushしたコミットがRxSwiftリポジトリにpush成功するのなら、きっとあなたはRxSwiftのコラボレーターなのです)。

方法2: RxSwiftをXcodeのSwift Packageで導入する

ユニットテストに関してコードを試したいなら、iOSアプリを作成するようにプロジェクトを作成しユニットテストを導入する手順が慣れているはずです。

説明のため例としてRxSwiftDemoAppという名前でプロジェクトを作ります。

テストコードを試したいからこの手段を選んだわけなので、プロジェクトの[ ] Include Testsにチェックを付けましょう(もちろんあとでテストを追加することはできますが)。

RxSwiftの導入はPackage Dependencyから追加できます。

検索用のフィールドにRxSwiftのリポジトリを入力すればパッケージが見つかります。

実際に保守運用していくアプリではないため、バージョンは固定でよいでしょう(好きにしてください)。上のスクリーンショットでは6.5.0としています。

RxSwiftのパッケージをAdd Pacakageしたあとは、次のようにどのターゲットに対してRxSwiftのモジュールを導入したいのかを選択する画面が表示されます。ここで間違えてしまってもいつでもターゲットごとの設定から変更できるので適当にやってもかまいません。

例ではRxSwiftDemoAppが本体のターゲット(ホストアプリケーション)であり、RxSwiftDemoAppTestsがそのユニットテスト用のターゲットです。

  • RxBlocking
    • テストターゲットを指定
  • RxCocoa
    • ホストアプリケーションを指定
  • RxRelay
    • ホストアプリケーションを指定
  • RxSwift
    • ホストアプリケーションを指定
  • RxTest
    • テストターゲットを指定

(RxSwift-Dynamicなどについては選択しなくてかまいません。後述します)

RxSwiftDemoAppTestsでテストコードを書けるようになったはずです。例としてRxBlockingを使うコードを示します。

蛇足: RxSwift-Dynamicなどについて

Swift Package Managerは利用側の必要に応じてスタティックリンクまたはダイナミックリンクなフレームワークとして利用するかが変化します。

https://github.com/apple/swift-package-manager/blob/release/5.6/Documentation/PackageDescription.md#methods-2

A library's product can either be statically or dynamically linked.
If possible, don't declare the type of library explicitly to let the Swift Package Manager choose between static or dynamic linking based on the preference of the package's consumer.

  • ライブラリはスタティックリンクまたはダイナミックリンク
  • 可能なら(ライブラリ提供者が)明示的にスタティックリンクまたはダイナミックリンクかを宣言しないようにすることで利用者に選択させる

仕様上の基本方針は上記となっています。しかし現状の動作上はスタティックリンクかダイナミックリンクかを利用者が設定することはできません(Xcode 13.3.1)。さらに、利用しようとした際のデフォルト動作としてスタティックリンクで利用しようとします。そのために、あえてダイナミックリンク指定をしたものを選択できるように提供してくれているわけです。

参考

Discussion