Objective-C 類別(category)和擴展(Extension)

一、類別(category)

使用Object-C中的分類,是一種編譯時的手段,容許咱們經過給一個類添加方法來擴充它(可是經過category不能添加新的實例變量),而且咱們不須要訪問類中的代碼就能夠作到,這點和javascript中使用原型來定義屬性有點相似。javascript

咱們能夠爲一個類建立一個新的方法,而不須要在代碼中編輯類定義。java

下面就是定義並使用分類的例子程序,經過下面代碼,咱們能夠給Object-C中的NSString 添加camelCaseString分類,使用camelCaseString方法,就能夠去掉一個字符串中的空格,並將原有空格後的單詞改寫成大寫(即將字符串轉化爲駝峯式)。api

#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;
}

  

二、擴展(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
相關文章
相關標籤/搜索