objective-cのプロトコルとデリゲートの違いについて

空気が湿ってきて、天パの自分には嫌な時期ですね。

 

objective-cがプログラム初めての人にとっては、プロトコルとデリゲートの違いについて悩むかもしれません。なんで、今回は今日1日考えたプロトコルとデリゲートの違いについて自分なりのまとめです。

自分で書いといてなんですが難しい記事を選びましたね。突っ込み募集。

Javaが一番ましに使える言語なんでちょいちょいJavaで置き換えてみます。

 

 

プロトコルとは?

プロトコルってIPアドレスのPやら、TCPのPとかしか思いつきませんでした。

objective-cでコードを書いて行く上でデリゲートというものを自然と使っていましたが、知り合いに質問され自分もわからなくプロトコルってデリゲート?な感じになりました。

まずプロトコルとはここの方の資料を大分参考にさせてもらうと

プロトコルはある目的のために必要となるメソッドの宣言ををまとめたもの。
取り入れたメソッドはすべて実装しなければならない。

つまりJavaでいうインターフェースですね。抽象化したメソッドを用意しておいて、それらを実装すれば大丈夫そう。プロトコルの採用は<プロトコル名>ので出来ます。

 

 

デリゲートとは?

C#で学んだときは委託すると覚えてました。

例えばコールバック関数と言われているイベント系のものはそうです。

this.btnCallback.Text = "デリゲートによるコールバック";
this.btnCallback.Click += new System.EventHandler(this.btnCallback_Click);

てな感じです。インスタンスを別のインスタンスに受け渡すイメージだと…思ってます。これについてはまだ自分も曖昧かもしれないです。

objective-cのデリゲートも受け渡す、というイメージでプロトコルを定義したクラスで

if([デリゲート名(プロトコル名) respondsToSelector:@selector(プロトコルで定義したメソッド名)]){
[デリゲート名(プロトコル名) selectorで指定したメソッド];
}

を書きます。これにより、プロトコルを<>やったクラス内で定義したメソッドが実装されているのか判定します。そして、もし実装されていれば実行します。

インスタンスとか受け渡してないですが、あるクラスから「デリゲートを<>したクラスに委託している」という感覚でいいと思います。

 

 

うーん、一応結論です。

プロトコルとデリゲートの違いについて議論して、なんとなく理解したと思ってたんですが、いざ書いてみるとだめだめですね。

プロトコルはインターフェースと同じで継承したクラスに実装する必要がある。デリゲートはそれにプラスして、そのプロトコルを宣言したクラスから他のクラスに定義したメソッドを見つけ出す事が出来る…ってことでいいのかも。