Objective-Cの言語仕様(プロトコル編)
プロトコル
Javaでいうinterfaceのこと。
メソッドの宣言を定義した集合だけの存在。
一応、静的型付けっぽい言語なので、「プロトコル、要るよねぇ〜」ってことなんでしょうか。
どっちかというと最後に記述するデリゲートの実装漏れを防ぐ役割の方が使用頻度高いかも。
まあ、とりあえずJavaのinterfaceとの対比から。
Javaの例
public interface Animal { public void say(); }
public class Duck implements Animal{ public Duck() { // ただのコンストラクタ } public void say() { System.out.println("ガーガー"); } }
Obj-Cの例
Animal.h
@protocol Animal - (void) say; @end
Duck.h
#import "Animal.h" @interface Duck : NSObject <Animal> @end
Duck.m
#import "Duck.h" @implementation Duck -(void) say { NSLog(@"ガーガー"); } @end
使うファイル
#import "Duck.h" 関数{ Duck *d = [[Duck alloc] init]; [d say]; }
結果
2012-03-15 17:06:46.214 RENSYU[2499:f803] ガーガー
@optional
プロトコルを作る立場としては、
@protocol Animal -(void) say -(void) hoeru -(void) wameku -(void) sawagu @end
とか作ってる段階で、いやいやこれ全部実装してもうらう必要なくね?
全部実装したい人はすればいいけど、、、
となったときに @optional を使えば、必要じゃないものは実装しなくてよくなる。
@protocol Animal -(void) say @optional -(void) hoeru -(void) wameku -(void) sawagu @end
デリゲート
Objective-Cといえばデリゲート。
なんかいっぱいメソッドを実装しないといけないですよね。
てか何を実装していいかわかんなくね?忘れたらどうしよう。
そんなときにもプロトコルを使おう。