イベント処理の簡易化、間接化(#2)
この方法はアクションを複数のイベントと統合できたり、動的にアクションを差し替えたりと柔軟性の高いプログラミングができるが、それでもイベント処理用のメソッドがばらまかれるのは避けられない。JavaやC#のようにラムダや無名クラスのような仕組みは使えないのだろうか。
種明かしにもならないが、Objective-Cでも同じことができる。
ブロックプログラミングトピック - Cocoa > Objective-C Language
(#PDF注意)
iOS4で導入されたBlocksを使えば、前回のイベントとセレクタのバインドは以下のように書けるはずだ。
__block InfoViewModel* vm = [[InfoViewModel alloc]init]; [button addBlockForAction:^(void) { RetreiveInfoTask* task = [[RetreiveInfoTask alloc] init]; vm = [task executeInBackgound:[textCode text] moreParams:nil]; } forControlEvents:UIControlEventTouchUpInside];
__block修飾子を付加することで、ブロックの中でも変数を変更することができる。
voidでは不便だと思うかもしれないが、スコープの外側の変数を参照できるので、そもそも引数なんて必要無いのだ。
さて、どうやってこのように書けるようにするかは、この後考えよう。