tags: OC 30 day
延展: Extension
是一个特殊分类,所以延展也是类的一部分。extension 没有名字只有声明,没有实现。与本类共享一个实现。Extension的语法
语法:
@interface 本类名()
@end
没有实现。和本类共享一个实现。
为类添加Extension的步骤
只有一个.h文件。文件名称:本类名_取得文件名.h。
这个文件中只有Extension的声明。
@interface Person()
@end
新增一个OC文件,File Type点选 Extension。
Extension 的基本使用
Extension 的本质是一个分类,作为本类的一部分。只不过是一个特殊的分类,没有名字。延展只有声明,没有单独的实现,合本类共享一个实现。Extension 与 class 的区别
分类有名字,Extension没有名字,是一个匿名的分类。每一个分类都有单独的声明和实现,而Extension只有声明,没有单独的实现,和本类共享一个实现。分类只能新增方法,而延展中任意成员都可以写。分类当中可以写@property 但是只会生成 getter setter的声明。Extension中写@property 会自动生成私有属性,也会生成getter setter的声明实现。Extension的应用场景
为类写一个私有的 @property 。
生成的getter,setter方法只能在类的内部访问,不能在外部访问。
其实,我们可以想: @property生成私有属性,生成getter setter的实现,不要声明。
@implementation Person{ int _age;}- (void)setAge:(int)age{ _age = age;}- (int)age{ return _age;}@end
我们可以在 @implementation 里面声明一个变数,再赋予他getter与setter。但是这样又回到了原点,我们想要利用 @property简化getter与setter的流程。
那我们该怎么做? Extension
@interface Person()@property(nonatomic,assign)int age;@end@implementation Person@end
这个操作有实现,会实现在哪里呢? @implementation 。
Extension 在100%的情况下不会独佔一个文件。都是将延展直接写在本类的实现文件当中。这个时候,写在延展中的成员,就相当于这个类的私有成员,只能在本类的实现中访问,外部不能访问。
如果想要为类写一个私有属性,虽然我们可以定义在@implementation之中,但是请不要这么写,这样很不规範。写一个Extension,定义在Extension当中。
也建议声明写在延展当中,实现写在本类的实现当中。提供代码的阅读性。
如果想要为类写一个私有的 @property 就直接写在Extension就可以了。
Extension 天生就是私有化类的成员的
如果类的成员只希望在类的内部访问,那么就将其定义在延展中。
如果类的成员允许被外界访问,定义在本类的interface之中。