Objective-C 類別(category)和擴充套件(Extension)

子非あ魚發表於2013-09-25

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

  

相關文章