強引さが優しさに変わるとき

Cocoaにはかなり強引なメソッドがいる。その名もNSControlクラスのtakeDoubleValueFrom:*1。あまりにも強引すぎて、個人的には正直理解しずらい。
メソッド名だけみると、引数に指定されるインスタンスの値を取得するというもの。しかし、戻り値は、void。値を取得しているにも限らず、戻り値が値ではない。

強引な動き

下記ソースを例に動きを見てみる。

[textField takeDoubleValueFrom:slider];

次のように動く。

  1. sliderのvalueを取得する
  2. textFieldのvalueに1で取得したsliderのvalueを設定する

おいおい、人から取得した値を自分へ勝手に設定するのかい。これは分かりにくい。というより強引すぎる。

強引さは優しさに

とは言え、この強引さは、Interface Builderで使うときは、逆に優しさに変わる。
takeDoubleValueFrom:は、Interface BuilderにおいてプログラムレスでViewを連動させる仕組みに使われる。よくある例だと、Sliderのつまみを動かすと、sliderの値に連動して、textFieldにその値が反映されるというもの。KVB(Key Value Binding)を使って、実現しているのではないのとよく言われるが、そんな小難しいことはしていない。takeDoubleValueFrom:のみを使うことにより実現できる。
具体的には、Interface BuilderでsliderとtextFieldを関連付け*2、実行させると、次のように動く。

  1. xibファイル読み込み時に、sliderのtargetにtextFieldが設定され、actionにtakeDoubleValueFrom:が設定される。
  2. sliderのつまみを動かし、sliderの値を変更すると、textFieldのtakeDoubleValueFrom:が呼び出され、textFieldにsliderのvalueが設定される。
  3. 最後に、textFieldの再表示が行われる。

takeDoubleValueFrom:を使うと、View同士の連動がtargetとactionの設定だけでできる。つまり、Interface Builderにとって、takeDoubleValueFrom:の強引さは優しさに変わる。

最後に

自分で書いても理解しがたい。しかし、この考え方は、Interface Builderを使いこなす上でも肝になる。慣れるしかない。

*1:類似メソッドは、takeFloatValueFrom:、takeStringValueFrom:等

*2:関連付けの矢印はどっちの方向なんだか混乱する