Categories and class extensions 种类和类扩展

之前我们已经简单介绍过了类扩展(class extension),但是这其实是种类(categories)下面的等一小部分。Objective-C 里面的种类和 Swift 的扩展但是有一些区别的,至少 Objective-C 的种类只能在类上面使用。

种类是类扩展的名称的集合,其实没有什么实际的意义,这也就是为什么 Swift 把这个概念去掉了。它的作用是可以让你认出这是属于某一扩展是属于哪一个类的,经常这样:ClassName+CategoryName。

比如说有一个 UIColor 类,这个类的作用是把你是最喜欢的颜色,用随机的形状表达出来。那你就可以把这种种类叫做:UIColor(RandomShades),文件命名为: UIColor+RandomShades.h 和 UIColor+RandomShades.m。

苹果使用种类是为了区分 iOS 和 OS X 这两个系统。比如说都是使用 NSString 类,但在 OS X 系统的 NSString(NSStringDrawing) 而在 iOS 系统里是 NSString(UIStringDrawing)。

由于种类可以在所有的类上起作用,哪怕是苹果自己的系统类也是一样的,所以你要给好好起名字,比如说你给 NSString 一个叫 trim 的方法。但是如果新版本的 iOS 发布了,NSString 里就是有 trim 方法的呢,这就很糟糕。所以你可以把它命名成 ts_trim,这样的话就算版本更新到 Taylor Swift,都还是可以用的。

现在我们来创建一个 trim 种类,依次点击 New > File,接着是 OS X > Source > Objective-C File,然后在 File 这一栏填上 Trimming,在 File Type 这一栏选择 Category,在 Class 这一栏选择 NSString。

然后你会看到两个文件,NSString+Trimming.h 和 NSString+Trimming.m,这是一个空的接口文件和一个空的实现文件,你可以直接在里面写想要的代码。

在我们这个例子里,就只写一个 stringByTrimming 方法,我们后面还会介绍 Cocoa,系统库和框架。我们先把它命名为 ph_stringByTrimming,这样就不会搞混了。首先我们在 NSString+Trimming.h 文件里加入这几行代码:

@interface NSString (Trimming)
- (NSString*)ph_stringByTrimming;
@end

注意 Trimming 是写在括号里面的,这是为了和 NSString 自带的方法区别开来。原因还是我之前说过的, Objective-C 没有命名空间。然后把这段代码放到 NSString+Trimming.m 文件里:

@implementation NSString (Trimming)
- (NSString*)ph_stringByTrimming {
    return [self stringByTrimmingCharactersInSet:[NSCharacterSet
whitespaceCharacterSet]];
} @end

这个的实现文件也是在括号里写了 Trimming,但是这个也是并没有什么卵用的,哪怕写成 @implementation NSString (FishFood),依然可以编译。

注意哦,这里用到了 self。这是因为 Xcode 知道我们要在这加 NSString,而这个他指向的是已经存在的 NSString 实例。

现在,我们就可以把 ph_stringByTrimming 加到 NSString 了,如果我们要调用它的话,引入 NSString+Trimming.h 就好啦。

results matching ""

    No results matching ""