通过扩展类来增强类的扩展性。非常好用的一个增强类功能的方式,可以参考C#的 partial 部分类。

下面的例子直接使用扩展类。不修改原类型 Foo的前提下,给 Foo 添加了一个 GetDescription 实例方法。并且访问了 FoostringOnFoo 属性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#import <Foundation/Foundation.h>
#import "Foo.h"
@interface Foo (Print)
-(NSString*)GetDescription;
@end
@implementation Foo (Print)
-(NSString*)GetDescription
{
if (self.stringOnFoo) {
NSLog(@"%@",self.stringOnFoo);
return self.stringOnFoo;
}
return @"";
}
@end
int main(int argc, const char * argv[]) {
Foo* fo = [[Foo alloc]init];
fo.stringOnFoo = @"helloworld";
[fo GetDescription];
return 0;
}

扩展类型的时候记得要加上属于自己的前缀,因为在原类型中可能后续会追加与扩展类的重名的方法签名,导致无法调用,即被扩展类的方法覆盖。

匿名类扩展

我在这里声明了一个匿名的扩展类型。然后在 Foo.m 中进行了实现。这个接口声明对使用者隐藏了。所以也不用 import 这个匿名头文件,可以直接调用。

1
2
3
4
5
6
7
8
9
10
11
@interface Foo()
-(void)InvokePrivateMethod;
@end
int main(int argc, const char * argv[]) {
Foo* fo = [[Foo alloc]init];
[fo InvokePrivateMethod];
return 0;
}