Objective-c-extensions
提供:Dev Guides
Objective-C拡張
クラス拡張はカテゴリとある程度類似していますが、コンパイル時にソースコードを持っているクラスにのみ追加できます(クラスはクラス拡張と同時にコンパイルされます)。
クラス拡張によって宣言されたメソッドは、元のクラスの実装ブロックに実装されているため、たとえば、NSStringのようなCocoaまたはCocoa Touchクラスなどのフレームワーククラスでクラス拡張を宣言することはできません。
拡張機能は、実際にはカテゴリ名のないカテゴリです。 しばしば*匿名カテゴリ*と呼ばれます。
拡張を宣言する構文は、標準のObjective-Cクラスの説明と同様に@interfaceキーワードを使用しますが、サブクラスからの継承を示すものではありません。 代わりに、以下に示すように、括弧を追加するだけです-
@interface ClassName ()
@end
拡張機能の特性
- ソースコードの元の実装があるクラスに対してのみ、拡張機能をクラスに対して宣言することはできません。
- 拡張機能は、クラスに固有のプライベートメソッドとプライベート変数を追加します。 *拡張内で宣言されたメソッドまたは変数は、継承されたクラスからもアクセスできません。
拡張機能の例
拡張機能を持つクラスSampleClassを作成しましょう。 拡張機能では、プライベート変数internalIDを用意します。
次に、internalIDの処理後にexternalIDを返すメソッドgetExternalIDを用意します。
以下に例を示しますが、これはオンラインコンパイラでは機能しません。
#import <Foundation/Foundation.h>
@interface SampleClass : NSObject {
NSString* name;
}
- (void)setInternalID;
- (NSString *)getExternalID;
@end
@interface SampleClass() {
NSString *internalID;
}
@end
@implementation SampleClass
- (void)setInternalID {
internalID = [NSString stringWithFormat:
@"UNIQUEINTERNALKEY%dUNIQUEINTERNALKEY",arc4random()%100];
}
- (NSString *)getExternalID {
return [internalID stringByReplacingOccurrencesOfString:
@"UNIQUEINTERNALKEY" withString:@""];
}
@end
int main(int argc, const char *argv[]) {
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
SampleClass *sampleClass = [[SampleClass alloc]init];
[sampleClass setInternalID];
NSLog(@"ExternalID: %@",[sampleClass getExternalID]);
[pool drain];
return 0;
}
プログラムをコンパイルして実行すると、次の結果が得られます。
2013-09-22 21:18:31.754 Extensions[331:303] ExternalID: 51
上記の例では、internalIDが直接返されないことがわかります。 ここでは、UNIQUEINTERNALKEYを削除し、メソッドgetExternalIDで残りの値のみを使用できるようにします。
上記の例では文字列操作を使用していますが、暗号化/復号化などの多くの機能を使用できます。