My Profile Photo

Justin Chou


人生的奇妙在于,将不可能变成可能。


什么是 Extension

Extension在语法上和Category非常相似,可实际上却又不一样。在语法上,Extension更像是一个没有名字的Category。在class名称后面直接加上一个空的括号()就是Extension,而在Extension中定义的方法需要在原来的classimpletement中实现。形如下:

@interface MyClass: NSObject
@end

@interface MyClass()
- (void)test
@end

@impletementation MyClass
- (void) test {}
@end

Extentsion 的作用

  1. header(.h 文件)进行分组
    如果在一个class声明了太多的的method,可以使用Extension对这些method进行分组归类,将这些method放到Extension中去。Extension除了可以对method进行分组,也能对成员变量进行分组。
  2. 管理 Private Methods
    在早期的Xcode中,若没有声明method而是直接实现这些method,当调用这些method时,会出现警告,而这些警告往往是很重要的。把这些method移到其他方法之前,可以消除警告。但是不能保证完全消除,因为这些method之间也有可能相互调用。那就需要进一步知道这些method调用顺序,这样做实在是太麻烦了,并不可取。苹果给的建议是在.m的开头写一个Extension,然后将这些method放在这个Extension中,这样就能避免那些警告。

Swift中,同样也有一个Extension,可以直接使用用来对class进行扩展。这个Extension并不是Objective-C中的Extension,更像是其中的Category。这三者的差别是,Objective-C中的Category需要给定名字,Objective-C中的Extension是没有名字的CategorySwift中的Extension也同样没有名字。Swift中的Extension还能对protocolstruct进行扩展。

Category 和 Extension 到底有什么区别
如果两者有什么明显的不同点话应该就是,Extension可以添加成员变量而Category不可以。但是Category可以通过一种方法来实现添加成员变量的效果。苹果提出一套叫做Assocaited Object的方案,可以在Category中添加getter/setter方法。这个方法的大致思想是在runtime,创建了一张表,这张表格能够记录哪个对象关联了哪个类。