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といえばデリゲート。
なんかいっぱいメソッドを実装しないといけないですよね。
てか何を実装していいかわかんなくね?忘れたらどうしよう。
そんなときにもプロトコルを使おう。