Objective-Cカテゴリ(category)と拡張(Extension)

1951 ワード

1、カテゴリ(category)
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)
拡張は匿名分類であり、以下に拡張の例を示します.
@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