Objective-Cで既存クラスを拡張する方法


JavaやC#などの純粋なオブジェクト指向言語では、クラスの拡張に継承を用いることが多いと思います。ただ、継承を用いるとクラスの名前が変わってしまうため(NSString→MYString等)色々と面倒で使い勝手も良くありません。

Objective-Cではカテゴリという仕組みを用いることで、クラス名を変えずに既存クラスにメソッドを追加することができます。以下は標準文字列クラスNSStringにequals:メソッドとunicodeメソッドを追加した例です。

BOOL eq = [@"foo" equals:@"bar"];
const char *cstr =[@"DJ" unicode];

作り方はこうです。

// カテゴリー宣言
@interface NSString (適当なカテゴリー名)
- (BOOL)equals:(NSString *)string;
- (const char *)unicode;
@end

// カテゴリー実装
@implementation NSString (適当なカテゴリー名)
- (BOOL)equals:(NSString *)string {
  return [self isEqualToString:string];
}
- (const char *)unicode {
  return [self cStringUsingEncoding:NSUnicodeStringEncoding];
}
@end

カテゴリーによる機能拡張は意外と知られていないようです。頻繁に記述する処理を汎用化する際の有効な手段にもなりますので非常にオススメの機能です。


俺「お前、意外と凄げーのな!」
Objective-C「ええまあ、仕様ですから」

広告