Swift中的代码访问权限控制
模块和源文件
- 模块指的是独立的代码分发单元,框架或应用程序会作为一个独立的模块来构建和发布。在Swift中,一个模块可以使用import关键字导入另外一个模块
- 源文件就是Swift中的源代码文件,它通常属于一个模块,即一个应用程序或者框架。尽管我们一般会将不同的类型分别定义在不同的源文件中,但是同一个源文件也可以包含多个类型、函数之类的定义
访问级别
潜规则1
- 如果一个类的访问级别是fileprivate或private那么该类的所有成员都是fileprivate或private(此时成员无法修改访问级别),如果一个类的访问级别是open、internal或者public那么它的所有成员都是internal,类成员的访问级别不能高于类的访问级别(注意:嵌套类型的访问级别也符合此条规则)
潜规则2
- 常量、变量、属性、下标脚本访问级别低于其所声明的类型级别,并且如果不是默认访问级别(internal)要明确声明访问级别(例如一个常量是一个private类型的类类型,那么此常量必须声明为private或fileprivate)
潜规则3
- 在不违反1、2两条潜规则的情况下,setter的访问级别可以低于getter的访问级别(例如一个属性访问级别是internal,那么可以添加private(set)修饰将setter权限设置为private,在当前模块中只有此源文件可以访问,对外部是只读的)
潜规则4
- 必要构造方法(required修饰)的访问级别必须和类访问级别相同,结构体的默认逐一构造函数的访问级别不高于其成员的访问级别(例如一个成员是private那么这个构造函数就是private,但是可以通过自定义来声明一个public的构造函数),其他方法(包括其他构造方法和普通方法)的访问级别遵循潜规则1
怎样创建一个模块
- 这里新建一个模块后,创建一个Human类
这里没有导入Teacher
如果在其他模块想用Human,需要将Human的类用public修饰
如果在外边继承Human, 也不行,public等级不行
这里需要将Human的等级修改为open
另外,结构体没有open权限,结构体只能用public
如果父类是fileprivate, 那么子类也必须是
上面的错误是HumanSex是内嵌类,并用private修饰,那么超出{}后, 则不能访问
如果属性继承于private,那么该属性也必须声明为private
注意此时,外部访问不到age属性