■プロトコル
JavaやPHPのインターフェース的なもの。
Animal.h
動物という種は存在しないので、以下のようにプロトコルとして定義した。
#import <Foundation/Foundation.h> @protocol Animal @property(copy, readwrite) NSString *_name; -(id) init:(NSString *)name;// initialize -(NSString *) cry: (NSString *)name;// instance method +(NSString *) getKind; // class method @end
Dog.h
上述で定義したプロトコルを以下のようにして実装する。
#import "Animal.h" @interface Dog:NSObject<Animal> @end
Dog.m
以下のように実装する。
#import "Dog.h" @implementation Dog @synthesize _name; - (id) init: (id) name { self._name = name; return self; } -(NSString *)cry: (NSString *)name{ return [NSString stringWithFormat:@"bow! from %@ to %@", self._name, name]; } +(NSString *)getKind{ return @"Dog"; } @end
ちなみに、プロトコルで宣言したメソッドが実装されていない場合、warningが発生する。
■カテゴリ
複数のクラスに分割したり、クラスに新しい機能を追加したりできる。
trim.h
#import <Foundation/Foundation.h> @interface NSString(Trim) - (NSString *) trim; @end
trim.m
#import "trim.h" @implementation NSString(Trim) - (NSString *) trim{ return [self stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]; } @end
上述の記述によって、NSStringクラスにTrimメソッドが追加される。文法は全然違うけどJSのprototype的な発想かもしれん。