カテゴリ機能を使用して独自メソッドを追加する - Objective-C プログラミング

PROGRAM


カテゴリ機能を使用して独自メソッドを追加する

Objective-C には "カテゴリ" という、メソッドやプロパティを後から追加できる機能が用意されています。

これの面白いところとしては、既存の NSString といったクラスについても、独自機能を拡張することができるところです。

 

たとえば、数字が現れるより前までの文字列を取得する "substringExToNumericCharacter" というメソッドを NSString に追加してみることにします。

そのような場合、先ずはヘッダーファイルとして、次のような内容のファイルを用意します。

 

// NSStringExtension.h

 

// 拡張したい既存のクラス名の後に、任意のカテゴリ名を括弧で括って指定します。

@interface NSString (EzExtension)

 

// 既存のクラスに追加するメソッドやプロパティを、通常通りの方法で宣言します。

- (NSString*)substringExToNumericCharacter;

 

@end

このようなヘッダーファイルに対して、実装ファイルはたとえば次のようにします。

// NSStringExtension.m

 

#import "NSStringExtension.h"

 

// ヘッダーで宣言したカテゴリ名を含むクラス名を指定しています。

@implementation NSString (EzExtension)

 

// ヘッダーで定義したクラスメソッドの実装です。

- (NSString*)substringExToNumericCharacter

{

NSString* result;

 

NSUInteger to_index;

unichar check_character;

 

for (to_index = 0; to_index < self.length; to_index++)

{

check_character = [self characterAtIndex:to_index];

 

if (check_character >= '0' && check_character <= '9')

{

// 数字が見つかったらそこまでとします。

break;

}

}

 

result = [self substringToIndex:to_index];

 

return result;

}

このような感じにすることで、既存の NSString クラスにこれらの機能が実装されました。

このうちのたとえば、静的メソッド "stringExWithStringOrNil" を使用する場合には、あたかも最初から NSString にこのメソッドが実装されていたかのように、次のように呼び出すことができるようになりました。

NSString data = @"string1";

NSString value = [data substringExToNumericCharacter];

もちろんこのとき、このメソッドを利用するためには、そのソースコードのどこかでこのカテゴリを定義したヘッダーファイル(ここでは "NSStringExtension.h")を #import しておく必要があります。

 

また、このカテゴリ機能で定義したメソッドを静的ライブラリに格納したい場合には、静的ライブラリを使用する側のプロジェクトで、リンクオプションを調整する必要があるようです。

こちらについては 静的ライブラリ内のカテゴリされた関数が呼び出せない でお話していますので、そちらを参考にしてください。

[ もどる ]