
Objective-C では、高位のフレームワークで、低位のフレームワークのクラスを「カテゴリ」の仕組みを利用することにより、拡張することができます。このとき、低位のフレームワークに上位のフレームワークが影響を及ぼす事無くクラスを拡張することができます。(のメモ)
たとえば Objective-C で文字列を扱うにはNSString というクラスを使用します。
NSString クラスは Mac OS でも使用可能な、低レベルレイヤーの Foundation フレームワークで定義されているクラスです。
iPhone SDK では、この NSString の文字列を iPhone の画面上に表示するメソッド「drawAtPoint:location withFont:font」が用意されています。
// 画面上に Hello World と表示します。
UIFont *font = [UIFont fontWithName:@"HiraKakuProN-W3" size:14.0f];
NSString *str = @"Hello World.";
[str drawAtPoint:CGPointMake(0, 0) withFont:font];
このメソッドは iPhone SDK に存在する、UIKit という高レベルレイヤーのフレームワークが、「カテゴリ」の仕組みを使用して NSString を「拡張」しています。
一般的にクラスを拡張するには、オブジェクト指向の世界では「サブクラス化」が一般的です。Objective-C ではそれに加え、カテゴリによるメソッドの追加という方法があり、サブクラス化の問題点「既存のインスタンスを拡張できない」「メソッド呼び出しのオーバーヘッドが増える」「型が変わってしまう」などを解決しています。
カテゴリは Obejctive-C が、クラスへメソッドの動的な追加ができるようになっているために使用可能になっています。
Objective-C のオープンソースライブラリなどでは、文字列操作用のライブラリの場合、「StringUtils」などのクラスを作るのではなく、NSString をカテゴリで拡張しているのが多く見られます。
カテゴリで既存のクラスを拡張した場合のファイル命名規則は「既存のクラス名+"+"+カテゴリ名」が一般的です。
サンプル:文字列から空白文字を除去するための機能を NSString に追加する
XML や JSON の安全なパースの際には空白文字(や、改行文字)を除去します。
// NSString+TrimWhiteSpace.h
@interface NSString (TrimWhiteSpace)
- (NSString *) stringByTrimmingWhitespace;
@end
// NSString+TrimWhiteSpace.m
#import “NSString+TrimWhiteSpace.h”
@implementation NSString (TrimWhiteSpace)
- (NSString *) stringByTrimmingWhitespace
{
return [self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
}
@end
使用方法
NSString *original = @”Hello World”;
NSString *trimmed = [original stringByTrimmingWhitespace];
この機能は使用しているコードがスマートになるので、 ActionScript にもほしいと思ってしまいます。 AS2 ならば prototype とかで MovieClip に独自プロパティとか独自メソッドを追加できたものですが。
参考:Categories: Modifying Existing Classes in Objective-C | NumberGrinder
http://www.numbergrinder.com/node/40

