オタクなのでRxSwiftの話になるとつい早口にアレコレ喋りまくってしまうのですが、今回はそういった気持ちをそっと胸にしまって、RxSwiftを導入するとアプリ開発にどういう変化が起こるのか、なるべく多くの方に伝わるように心がけて話しました。

3行で書くと以下の通りです。

  • RxSwiftはイベントストリームをObservableで抽象化するライブラリ
  • 大抵のイベント処理はObservableからObserverへの接続で実装できる
  • イベントストリームの依存関係はオペレーターから読み取れる

その他、以下の3つについても話そうと思っていましたが、またの機会に。

  • エラーをどのように扱うようになったか
  • テストをどのように書けるようになったか
  • デバッグはどう変わったか

ReactiveCocoa

ReactiveCocoaに一言も触れられなかったので、少しだけ紹介しておきます。トーク中に紹介したイベントストリームの扱いはReactiveCocoaでも同様ですが、RxSwiftと比較するとReactiveCocoaには以下のような特徴があります。

  • ColdとHotのストリームを区別した型を持っている
  • ストリームがエラーの型を持っている

これらの特徴はプロジェクトの規模が大きくなると特に威力を発揮すると思われます。例えば、気を抜いてObservableのバインディングをしていると、うっかり以下のようなミスをすることがあるのですが、ReactiveCocoaの特徴はこれらを防げるのかもしれません(想像)。

  • Hotのつもりのストリームが実はColdでバインドした分だけ処理を発生させてしまう
  • エラーを想定していない箇所にエラーを流してストリームが切れっぱなしになる

また、UIKitのコンポーネントからストリームを取得する事情も異なります。RxSwiftでは素直にUIKit拡張からストリームを取得できますが、ReactiveCocoaのUIKit拡張はObjective-C時代の遺産を引き継いでおり、現行バージョンのストリームと相互変換して利用する必要があります。ReactiveCocoaとRxSwiftをある程度知った上でRxSwift選ぶ人の多くはこれを理由にするのではないかと思います。

現在では、UIKitから現行バージョンのストリームを取得できるRexというライブラリがあり、ReactiveCocoaのコミュニティによってメンテナンスされています。Rexがまだ普及していなかった去年の冬頃とは状況が変わってきているので、今からRxSwiftかReactiveCocoaのどちらかを選ぶ場合、選択するライブラリも異なるのかもしれません。

終わりに

3年前にYAPCのiOS版があるといいなと書いてたんですが、iOSDCで近い体験ができました。
おかげで、久しぶりの方とも初めての方ともたくさん話す機会に恵まれました。 http://blog.ishkawa.org/2013/09/22/yapc/

スタッフの皆様、おつかれさまでした!