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_hiddenAnyObserver<Bool>という、Boolを型とするObservableでないといけなかった
  • map()trueを返しているのは、タップというUIControlイベントをtrue/falseに型変換するため

ということでした。深く考えずつないでいけるかと思いきや、型の安全さにともなう制限があったわけですね。

まだまだ先は長そうです。