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
相关文章
相关标签/搜索