デリゲートとプロトコル

iPhoneフレームワークにはデリゲートが使用されている。関連の深いプロトコルとともに解説を行う。

デリゲート

デリゲートとは、あるメソッドを別のメソッドで実装する手段である。
controllerからItemをインスタンス化し、処理をdelegateクラスのメソッドに実装した例を示す。

Itemクラスのmethod1はdelegate先のメソッドを呼び出すように実装されている。
メソッドの実装をItem自身に持たせないことで、delegateクラスを変えることで途中でmethod1の実装を変えることができる。
extend(継承)でMethod1を実装した時に比べた場合、プログラム内で実装を変えることができる面で優れていると言える。

iPhoneフレームワークでのデリゲートの使われ方

iPhoneフレームワークでは、イベント処理で使用されている。(C#VC++/CLIと同じ)
Itemクラスのdelegate先をcontrollerクラス自信(self)にすることで、一度しか使用されないボタンクラスを複数クラスに分けることなく実装することができ、ソースの可読性を高めている。

プロトコル

メソッドが実装されることを約束するものである。(JavaC#のinterfaceと同じ)
例でいえば、Itemクラスがdelegate先のメソッドで実装されていて欲しいメソッドが宣言されており、delegate先であるcontrollerクラスはmethod1を実装しなければならない。(プロトコル内で@optionとなっているものは、実装しないでも問題ない。)

同じItemに違うメソッド

上記だけでは一つの画面内に2つ以上の違う動作をするItemをおけないように見えるが、異なる名前のメソッドを用意しておき、InterfaceBuilderで関連をしていすれば、違うメソッドを呼び出すことができる。同じ引数と返り値であれば、違う名前のメソッドを呼ぶことができるのがデリゲートのよい所である。