「try! ReactorKit」Satoshi Hachiya, RCUBE
八谷賢氏で「try! ReactorKit」というタイトルでの発表です。八谷氏は、パンケーキさんという名前でも知られ、「try! Swift」の運営と、Swift Package Managerのコントリビュートもしています。
この発表では八谷氏がReactorKitを使ってみて、つまづいた点をまとめています。まだReactorKitを利用していない開発者にとって、非常にありがたい内容です。
八谷氏は「try! Swift NYC 2017」に運営として参加していましたが、その際すでにReactorKitの作者であるJeon氏と会っていたと振り返りました。また、最近だとWWDC 2018(の開催後)に偶然出会い、話をしたそうです。実際にReactorKitに触れたのはその後のことになります。そのときに感じた印象やつまづいた点について紹介がありました。
ReactorKitについて、ドキュメントが非常に読みやすく、サンプルコードが豊富にあり、いつでも始められることを強調しました。サンプルコードについては、ReactorKitのREADMEの最後にリンク一覧があります。また、菅原氏が書かれた「ReactorKitを学ぶ」シリーズの記事も挙げられ、初学者向けの日本語ドキュメントが豊富にある点についても触れられました。
では、早速導入から始めます。CocoaPodsでインストールします。注意点としては、オフィシャルにCarthage対応されていないことが挙げられます。
次に、導入したいView Controllerに対応するReactorを作成します。最初に、Actionを書きます。ActionはEnumなのでcaseを追加していきます。今回は、増加と減少なので、increaseとdecreaseを追加します。
次に、Mutationを書きます。こちらもEnumで、変化の仕方を記述します。今回は、値を増やすか・減らすかなので、increaseValueとdecreaseValueを追加します。
次にStateです。StateはStructで必要なプロパティを宣言します。今回は値の増減なので単純にvalueというIntのプロパティを宣言します。
次にReactorのプロパティとしてinitialStateを初期化します。これは状態の初期値を表します。valueは0から始めたいのでvalueに0をセットしてinitalStateを初期化します。
続いてView Controllerです。View ControllerにViewというプロトコルを準拠させ、bind関数を書きます。このbind関数でボタンのタップのObservableをAction.increaseにマップしてそれをreactor.actionにバインドします。これで、インタラクションからアクションを発行することができました。非常に簡単ですね。
ここで八谷氏は、つまづいた具体的ケースについて紹介しました。
まず、「アクションが発行されない」問題です。実は今までの流れで抜けているパートがあります。それは、「View Controllerに作成したReactorをセットする」パートです。ここで重要なのは、そのView Controllerの外側でセットする点です。
次につまづいた点は、View Controllerが持つCollection Viewのコンテントオフセットからアクションを発行する際に起きたランタイムエラーです。これはRxCocoaでのエラーで、そのView ControllerをUICollectionViewDelegateに準拠させる必要があったそうです。RxSwiftやRxCocoaを初めて利用するケースを含め、こういった情報は非常に役立ちます。
さて、もう一度振り返り、「一方向のデータフロー」を体感します。ViewでボタンのtapからAction.increaseがReactorに伝搬します。ActionからMutationに変換します。そして最後にMutationからStateに変換し、ViewでStateをラベルのテキストに反映したら終了です。これでボタンを押すと、1増えて表示されるということが実現できました。
まとめ
八谷氏は全体としてコードが読みやすくなる点を指摘しつつ、特に以下の特徴を挙げていました。
- 責務を分けやすい
- Viewの状態を簡単に管理できる
- データフローを追いやすい
ここまで読んで「簡単そう!」と感じた方、ぜひ「try! ReactorKit」しましょう。
