Custom View + RxSwift - iOS
Custom Viewを作るときに、どうやってRxと連携させるかを忘れないように記事にしました。
※ここでは、customView.rx.textDidChanged.~
といったように、今までDelegate
として実装していたものをReactive
のExtension
として記述することをRx連携と呼ばせていただきます。
どうしてRx連携するの?
- プロダクトがRxをゴリゴリ使っているから
- コードが綺麗になる
プロダクトがRxSwiftをゴリゴリ使っている
自分が開発しているアプリではアーキテクチャがMVVMで、ViewとViewModelとのつなぎにRxSwift(RxCocoa)
を使っています。
そのため、RxSwiftで用意されていない場合は自分で連携させる必要があります。
コードが綺麗になる
コードの量が減るかどうかはプロダクトによりますが、Rxを使うと圧倒的に簡潔に分かり易くかけると思います。
どれくらい綺麗になるか、サンプルコードを書いてみたので比較してみてください。
Rx導入前
Rx導入後
一番メリットとして感じるのは、今まで分離して関数を用意していたのがclosure
として記述できることだと思います。
結果的にUIViewController
から煩わしいDelegateなどのコードが減るので、見通しもよくなります。
どうやって実装するの?
自作Viewを作るときに作成したDelegate
を使って、DelegateProxy
(Proxy: 代理)を作成し、それを使ってReactive
のExtension
としてDelegate
の中身を実装します。
今回は、内部にUITextField
を持っているFilledTextField
という自作Viewを使って、Rx連携する手順を紹介します。
コードはGithubのgist上げているので参考にしてください。
例として自作ViewのDelegate
の内の二つの関数をRx連携させてみます。
DelegateProxyの作成
DelegateProxy<P, D>
とDelegateProxyType
, 自作ViewのDelegate
を継承したクラス、DelegateProxyを作成します。
DelegateProxy<P, D>
のP
は自作View(FilledTextField)、D
は自作ViewのDelegate(FilledTextFieldDelegate)です。
ここでは自作ViewとProxyとがお互いのDelegateをつなげる作業を行います。
Delgateが複数ある場合は変更が必要ですが、そういったケースは稀なので今回は割愛します。
Extensionの実装
Reactive
のExtension
として実装していきます。
DelegateProxy
のmethodInvoked(_:)
を使って、Observableに変換します。
params
はDelegateの引数を指します。
完成!!
終わりに
一番FatになりがちなUIViewController
のコードを綺麗に書くことができ、コードの可読性も向上できました。
RxSwiftを使いこなすことは難しいですが、上手く使えるようになればコードを綺麗に書けるようになると思います。
使い倒してどんどんコードを綺麗にしていきましょう!