■
RxSwiftを勉強していますが、なかなか理解が進まないシリーズです。
RxSwift / RxCocoaのバージョンは2.2を対象にしています。
学習の手始めに「UIButton
がタップされたら、画面上にあるラベルをhidden
にする」というごくごく簡単な処理を書いてみようと思ったのですが・・・。どうにか動くものはできたものの、まだまだ予断を許さない状況です。
- ボタンがタップされたことを伝える
rx_tap
に、ラベルを隠すrx_hidden
を繋ぐだけでいいんじゃない?…と思ったけれど、タップと隠すのは別のオブジェクトだ。どうやってつなぐんだろう。 - どうやら別の
Observable
につなぐ場合はbindTo()
を使うと良さそうだ。でも、あれ?下のコードみたく書いてもエラーが出るだけだぞ?
button.rx_tap.bindTo(label.rx_hidden) // -> error: cannot convert value of type 'AnyObserver<Bool>' to expected argument type 'Variable<Void>' (aka 'Variable<()>')
- RxCocoaのサンプルを見ると
bindTo()
する前にmap()
を挟んでいるのが多いけれど、これはどういう意味だろう
と紆余曲折の結果、次のコードで動くようになりました。
button.rx_tap.map { true } .bindTo(label.rx_hidden) .addDisposableTo(bag)
問題点はなんだったかというと、
rx_hidden
はAnyObserver<Bool>
という、Boolを型とするObservable
でないといけなかったmap()
でtrue
を返しているのは、タップというUIControlイベントをtrue
/false
に型変換するため
ということでした。深く考えずつないでいけるかと思いきや、型の安全さにともなう制限があったわけですね。
まだまだ先は長そうです。