プロトコルはjavaでいうところのインターフェイスに近い。
クラスの実装はどうあれプロトコルに準拠したオブジェクトは
実装しなければいけないメソッドが決定される。(オプションでなければ実装しなければならない)
objective-cではデリゲートの実装によく登場する。
検証のため
プロトコル定義 FooProtocol
プロトコル準拠クラス Bar
を考える。
FooProtocolでは、@optional(実装が必須ではない)でfooメソッドを定義し、
@reqired(実装が必須)でfoofooを定義している。
BarクラスはFooProtocolに準拠しているのでfoofooメソッドの実装を行う。
流れとしては以上。
参考までに検証用のコードを以下に示す。
※@requiredを指定したはずのfoofooをBarにて実装を削除して
[bar foofoo]も削除、でも警告(foofooの実装をしないさいという警告)がでただけ。
必須だからコンパイルエラーではじくと思ったのだが。。警告レベルというのは注意が必要かも。
【プロトコルの定義 FooProtocol】
FooProtocol.h
#import <Foundation/Foundation.h>
@protocol FooProtocol <NSObject>
@optional
-(void)foo;
@required
-(void)foofoo;
@end
【プロトコルの実装クラス Bar】
Bar.h
#import <Foundation/Foundation.h>
#import "FooProtocol.h"
@interface Bar : NSObject <FooProtocol>
-(void)foofoo;
@end
Bar.m
#import "Bar.h"
@implementation Bar
-(void)foofoo
{
NSLog(@"foofoo is called");
}
@end
【メイン関数】
main.m
#import "Bar.h"
int main(int argc, const char * argv[])
{
id bar = [[Bar alloc] init];
[bar foofoo];
return 0;
}