现在请读者思考,为什么要将circleColor属性声明在BNRHypnosisView的类扩展中?将属性声明在头文件中和类扩展中有什么区别?
在第2章中介绍过,头文件是一个类的“用户手册”,其他类可以通过头文件知道该类的功能和使用方法。使用头文件的目的是向其他类公开该类声明的属性和方法,也就是说,头文件中声明的属性和方法对其他类是可见的(visible)。
但是,并不是每一个属性或方法都要向其他类公开。只会在类的内部使用的属性和方法应当声明在类扩展中。circleColor属性只会被BNRHypnosisView使用,其他类不需要使用该属性,因此它应该被声明在类扩展中。
在类扩展中声明类的内部属性和方法是良好的编程习惯,这样做可以保持头文件的精简,避免内部实现细节的暴露,保证头文件中全部是其他类确实需要使用的属性和方法,从而让其他开发者更容易理解如何使用该类。
在语法上,类扩展的声明方法与头文件类似,需要使用@interface指令,后跟类名,接着为一对空括号。声明属性和方法之后,需要使用@end代表类扩展的声明至此结束。通常应将该类扩展写在实现文件顶部,位于@implementation之前:
#import "BNRHypnosisView.h"
@interface BNRHypnosisView
@property (strong, nonatomic) UIColor *circleColor;
@end
@implementation BNRHypnosisView
子类同样无法访问父类在类扩展中声明的属性和方法。例如,BNRHypnosisView的子类无法访问circleColor属性。
有时需要让其他开发者了解类的某些内部属性和方法,以便更好地理解类的工作原理和使用方法。可以在另一个文件中声明类扩展,并将该文件导入类的实现文件中。
本书将使用类扩展声明其他类不需要访问的属性和方法,从而隐藏内部实现细节。