模块和源文件
Swift中的访问控制模型基于模块和源文件这两个概念。
模块指的是Framework或App bundle。在Swift中,可以用import关键字引入自己的工程。
在Swift中,Framewordk或App bundle被作为模块处理。如果你是为了实现某个通用的功能,或者是为了封装一些常用方法而将代码打包成Framework,这个Framework在Swift中就被称为模块。不论它被引入到某个App工程或者其他的Framework,它里面的一切(属性、函数等)都属于这个模块。
源文件指的是Swift中的Swift File,就是编写Swift代码的文件,它通常属于一个模块。通常一个源文件包含一个类,在类中又包含函数、属性等类型。
访问级别
Swift提供了三种不同的访问级别。这些访问级别相对于源文件中定义的实体,同时也相对于这些源文件所属的模块。
Public:可以访问自己模块或应用中源文件里的任何实体,别人也可以访问引入该模块中源文件里的所有实体。通常情况下,某个接口或Framework是可以被任何人使用时,你可以将其设置为public级别。
Internal:可以访问自己模块或应用中源文件里的任何实体,但是别人不能访问该模块中源文件里的实体。通常情况下,某个接口或Framework作为内部结构使用时,你可以将其设置为internal级别。
Private:只能在当前源文件中使用的实体,称为私有实体。使用private级别,可以用作隐藏某些功能的实现细节。
Public为最高级访问级别,Private为最低级访问级别。
访问级别的使用限制
在Swift中,访问级别有如下使用原则:访问级别统一性。
比如说:
一个public访问级别的变量,不能将它的类型定义为internal和private的类型。因为变量可以被任何人访问,但是定义它的类型不可以,所以这样就会出现错误。
函数的访问级别不能高于它的参数、返回类型的访问级别。因为如果函数定义为public而参数或者返回类型定义为internal或private,就会出现函数可以被任何人访问,但是它的参数和返回类型不可以,同样会出现错误。
默认访问级别
代码中的所有实体,如果你不明确的定义其访问级别,那么它们默认为internal级别。在大多数情况下,我们不需要明确的设置实体的访问级别,因为我们大多数时候都是在开发一个App bundle。
参考链接:Access Control