Objective-C分類(category)と拡張(Extension)
1、分類(category)
Object-Cの分類を使用すると、クラスにメソッドを追加することで拡張できます(ただしcategoryでは新しいインスタンス変数を追加できません)、クラスのコードにアクセスする必要がなく、javascriptでプロトタイプを使用して属性を定義するのと少し似ています.
コードでクラス定義を編集することなく、クラスに新しいメソッドを作成できます.
以下に分類を定義して使用する例プログラムを示します.次のコードでは、Object-CのNSStringにcamelCaseString分類を追加し、camelCaseStringメソッドを使用すると、文字列のスペースを削除し、元のスペースの単語を大文字に書き換えることができます(文字列をアルパカ式に変換します).
2、拡張(Extension)
拡張については、拡張は匿名の分類であることを理解することができます.しかし匿名分類とは異なり,拡張は新しいインスタンス変数を追加できる(拡張は一般的ではないほど強くなったと思うのではないか^^)
Xcode 4以降はカスタムクラスの.mファイルに拡張を使用することを推奨し、プライベートインタフェースを外部に露出させないようにコードパッケージ性を確保します.
次に拡張例を示します.
Object-Cの分類を使用すると、クラスにメソッドを追加することで拡張できます(ただしcategoryでは新しいインスタンス変数を追加できません)、クラスのコードにアクセスする必要がなく、javascriptでプロトタイプを使用して属性を定義するのと少し似ています.
コードでクラス定義を編集することなく、クラスに新しいメソッドを作成できます.
以下に分類を定義して使用する例プログラムを示します.次のコードでは、Object-CのNSStringにcamelCaseString分類を追加し、camelCaseStringメソッドを使用すると、文字列のスペースを削除し、元のスペースの単語を大文字に書き換えることができます(文字列をアルパカ式に変換します).
#import <Foundation/Foundation.h>
/*
:
、 ,
、 ,
*/
//NSString , 。
//CamelCase 。
// , 。
// :ClassName+CategoryName.h
@interface NSString (CamelCase)
-(NSString*) camelCaseString;
@end
@implementation NSString (CamelCase)
-(NSString*) camelCaseString
{
// NSString 。
//self 。
NSString *castr = [self capitalizedString];
// , 。
NSArray *array = [castr componentsSeparatedByCharactersInSet:
[NSCharacterSet whitespaceCharacterSet]];
//
NSString *output = @"";
for(NSString *word in array)
{
output = [output stringByAppendingString:word];
}
return output;
}
@end
int main (int argc, const char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSString *str = @"My name is bill.";
NSLog(@"%@", str);
str = [str camelCaseString];
NSLog(@"%@", str);
[pool drain];
return 0;
}
2、拡張(Extension)
拡張については、拡張は匿名の分類であることを理解することができます.しかし匿名分類とは異なり,拡張は新しいインスタンス変数を追加できる(拡張は一般的ではないほど強くなったと思うのではないか^^)
Xcode 4以降はカスタムクラスの.mファイルに拡張を使用することを推奨し、プライベートインタフェースを外部に露出させないようにコードパッケージ性を確保します.
次に拡張例を示します.
@interface MyClass : NSObject
- (float)value;
@end
@interface MyClass () { // :
float value;
}
- (void)setValue:(float)newValue;
@end
@implementation MyClass
- (float)value {
return value;
}
- (void)setValue:(float)newValue {
value = newValue;
}
@end