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で残りの値のみを使用できるようにします。

上記の例では文字列操作を使用していますが、暗号化/復号化などの多くの機能を使用できます。