Class extensions @interface Class ()
are a lot more powerful and can inject variables into the class. Categories @interface Class (Category)
can't.
What other differences are there, and when should one use a category over a class extension?
Class extensions @interface Class ()
are a lot more powerful and can inject variables into the class. Categories @interface Class (Category)
can't.
What other differences are there, and when should one use a category over a class extension?
主要区别是,一个扩展,编译器会期望你实现你主内的方法@implementation
,而与类别,你有一个单独的@implementation
块。 所以,你应该几乎只在你的主要的顶部使用扩展.m
文件(你应该关心的ivars唯一的地方,顺便说一句) -它的意思是公正的,一个扩展 。
一类扩展具有一些相似性类别,但它可以只被添加到您具有在编译时(类是在相同的时间类扩展编译)的源代码的类。 一类扩展声明的方法在@implementation块实施了原始类,所以你不能,例如,宣布一个框架类,一类扩展,如可可或可可触摸类喜欢的NSString。
声明一个类扩展的语法类似于语法类别,如下所示:
@interface ClassName ()
@end
因为没有名称在括号中,类扩展通常被称为匿名类别。
不同于常规类,一类扩展可以添加自己的属性和实例变量的类。 如果你在一个类扩展,像这样声明一个属性:
@interface XYZAnimal () {
id _someCustomInstanceVariable;
}
...
@end
恕我直言,这是最好把类扩展为专用接口的一类。 主接口(在.h文件中)作为公共接口定义与其他班级类的行为的合同。
使用类扩展隐藏个人信息
扩展类经常使用的公共接口与类本身的执行中使用额外的私有方法或属性扩展。 这是常见的,例如,以限定一个属性为只读的接口,但作为读写在执行以上声明的类的扩展,以使类的内部的方法可以直接改变属性值。
作为一个例子,XYZPerson类可能添加一个名为UNIQUEIDENTIFIER性质,旨在跟踪像在美国社会安全号码信息。
它通常需要大量的文书工作必须在现实世界中,分配给每个一个唯一的标识符,所以XYZPerson类接口可能声明该属性为只读,并提供一些请求的标识符进行分配,这样的方法:
@interface XYZPerson : NSObject
...
@property (readonly) NSString *uniqueIdentifier;
- (void)assignUniqueIdentifier;
@end
为了使XYZPerson类能够在内部更改属性,是有意义的重新声明财产多数民众赞成在该类的实现文件的顶部定义一个类扩展:
@property (readwrite) NSString *uniqueIdentifier;
注:读写属性是可选的,因为它是默认的。 你可能想重新声明属性时,为了清楚使用它。
类别是Objective-C语言的功能,让你添加新的方法,以现有类。 扩展是让你定义必须在主执行块来实现的方法类的特殊情况。
私人报关都可以在课堂上的扩展,主要是一些属性,因为我们已经没有必要,我们把它叫做之前声明的方法。
IOS扩展类同C#,Java抽象类或接口
IOS类类同C#类扩展