カテゴリを使ってプロトコルの後付け

Objective-Cでは、ひとまとまりのメソッド群が実装されているかを実行時に調べる方法として、プロトコルと呼ばれる物がある。

私は、まず「プロトコル」が存在し、それに対して「プロトコルに適応されたクラス」が存在すると考えていた。

しかし、Objective-Cでは、既存のクラスを後付けでプロトコルに適応出来ました。

以下のコードを実行するとログに”:-D”が表示されます。

#import "PTAppDelegate.h"

// プロトコルの定義
@protocol PTObjectValueProtocol
- (void)setObjectValue:(id<NSCopying>)obj;
- (id)objectValue;
@end

// プロトコルを後付けするカテゴリ
@interface NSControl (PTAppDelegate) <PTObjectValueProtocol>
@end
// 後付けしたプロトコルの実装
@implementation NSControl (PTAppDelegate)
@end

@implementation PTAppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // "protocol(PTObjectValueProtocol)"の部分は@protocolです。
    // sphinxがうまくコードを色づけしてくれなかったので@を抜かしました。
    if( [NSButton conformsToProtocol:protocol(PTObjectValueProtocol) ] )
    {
        NSLog(@":-D");
    }
    else
    {
        NSLog(@":-(");
    }
}
@end

基本的に、

  • “@interface 既存クラス名 (カテゴリ名) <プロトコル名>”
  • “@implementation 既存クラス名 (カテゴリ名)”

の2つを作るだけで問題なくプロトコル対応なクラスとして認識してくれました。