Introducing Swift - Access Control
本文主要记录在学习Swift中【访问控制】时的笔记。
模块和源文件
Swift中访问控制基于模块,一个framework或者.swift文件都是一个模块,通过import
关键字导入。
访问级别分类
- public:最高级别,模块内部可以无限制访问任何方法和实体,外界也可以无限制访问该模块内部的方法和实体;
- internal:模块内部可以无限制访问任何方法和实体,外部不可见;
- private:最低级别,只能在当前源文件中相互访问,模块内和外界均不可见。
默认访问级别为internal。
访问级别的设置不能产生冲突,例如函数访问级别应不低于其参数和参数类型的访问级别,否则函数可访问但参数或参数类型不可访问,产生错误。
访问控制语法
直接通过保留字public
,internal
,private
来声明。
注意:如果一个类的访问级别为public
,那么所有成员默认访问级别为internal
而不是public
。
实体的访问级别
元组
遵循最低访问级别原则,即元组访问级别采用其元素中最低访问级别,并且不需要显示定义,只会在使用时推导得到。
函数
遵循最低访问级别原则,通过参数和返回值类型确定,需要显示定义。
枚举
枚举成员继承枚举类型的访问级别,不能单独定义。如果枚举类型定义了原始值或者关联值,那么其访问级别必须不低于枚举类型的访问级别。
嵌套
继承外层访问级别,但是外层如果为public
,则默认为internal
。
子类
子类访问级别不高于父类访问级别。如果一个类的实体不被外界可见,我们可以通过继承并重写该实体,去改变它的访问级别。
常量、变量、属性、下标
以上实体的访问级别不得高于其类型的访问级别。
Access Method
setter
的访问级别可以低于getter
的访问级别,以此设置实体的读写权限。在var
或subscript
定义作用域之前,你可以通过private(set)
或internal(set)
先为它门的写权限声明一个较低的访问级别。
初始化
我们可以给自定义的初始化方法指定访问级别,但是必须要低于或等于它所属类的访问级别。但如果该初始化方法是必须要使用的话,那它的访问级别就必须和所属类的访问级别相同。
注意:如果一个类型被声明为public级别,那么默认的初始化方法的访问级别为 internal 。如果你想让无参的初始化方法在其他模块中可以被使用,那么你必须提供一个具有 public 访问级别的无参初始化方法。
协议
如果协议为public
访问级别,那么其必须实现的方法都是public
级别,此处与上文中其他实体有所不同。
协议继承遵循访问级别继承,子协议访问级别不高于父协议。
采用了协议的类的访问级别遵循它本身和采用协议中最低的访问级别。也就是说如果一个类是 public 级别,采用的协议是 internal 级别,那个采用了这个协议后,该类的访问级别也是 internal 。
如果你采用了协议,那么实现了协议必须的方法后,该方法的访问级别遵循协议的访问级别。比如说,一个 public 级别的类,采用了 internal 级别的协议,那么该类实现协议的方法至少也得是 internal 。
扩展
如果一个扩展采用了某个协议,那么你就不能对该扩展使用访问级别修饰符来声明了。该扩展中实现协议的方法都会遵循该协议的访问级别。
泛型
遵循最低访问级别。
类型别名
一个类型别名的访问级别可以低于或等于这个类型的访问级别。