概念
- 访问控制主要应用于封装代码对于多个工程的复用
- 访问等级由高到低分为五个,等级越高限制越少
1.open:本工程和其他Import该工程的工程可用。open只应用于类和类成员,使用open可以在本工程和其他Import该工程的工程使用子类和重写方法
2.public:同上,区别在于只能在本工程使用子类和重写方法,不能再其他工程
3.internal:只能用于其定义工程
4.file-private:只能用于源文件,隐藏具体实现内容
5.private:用于某一单一声明,隐藏具体实现内容
private与file-private的区别
- private 当前文件当前类中
- fileprivate 当前文件即可,不用当前类型。(同一文件多个类)
其他
- 不能将被某一实体所包含的实体定义为更高的访问等级,例如:
1.不能将属性定义为public,而将type定义为internal等
2.不能将方法定义为internal,而将参数返回值定义为private等 - 大部分情况下不需要自己定义,默认为Internal的访问等级
- 对于Single-Target App默认为Internal的访问等级,不需要额外定义,只需要在需要的地方声明private隐藏实现即可。(普通APP均为Single-Target可以使用多个target来实现大部分功能相同,个别功能不同的多个app,如滴滴司机版乘客版等)
- 由于默认的Internal不能用于其他target,所以对于unit test,要使用open或public来标记类。或者使用@testable来标记需要被测试的部分
- 对于类,将类定义的访问等级将会自动用于类的属性方法,例如定义了private的类,则它的属性方法默认为private。但是public对应的members默认为internal
- 对于元组,没有像类和结构体那样的独立定义访问等级的地方。而是根据其中元素隐式得到,如果其中元素等级不同时,取较低者。例如一个元素为Internal一个为private,则元组为private
-对于函数,类似于元组,取较低者。同时在显示声明函数的访问等级,且与参数返回值所取等级一致,否则无法编译通过 - 对于枚举,枚举定义直接应用于枚举值。例如枚举定义为public,则枚举值默认隐式为public
- 对于内嵌类型,访问等级和外部一致。但是对于外部是public时内嵌类型为internal,如果想内嵌类型也为public则需要显式定义
- 子类继承父类时,不可超过父类的访问等级。但是子类重写的父类方法,可以超过父类被重写方法的访问等级。同时子类方法可以调用父类中低于该子类方法的方法
- getter和setter。
numberOfEdits属性的读方法默认为internal,即函数外可读。写方法定义为private,即函数内可写,函数外不可写。struct TrackedString { private(set) var numberOfEdits = 0 var value: String = "" { didSet { numberOfEdits += 1 } } }
- 对于协议,定义类型访问等级与协议内容访问等级一致。例如协议定义为public,则其中必要方法等也为public,这与其他类型不同。其他类型中定义为public,members为internal