访问控制可以限定其他源文件或模块中的代码对你的代码的访问级别。这个特性可以让我们隐藏代码的一些实现细节,并且可以为其他人可以访问和使用的代码提供接口。
Swift 中的访问控制模型基于模块和源文件这两个概念。
模块:
模块指的是独立的代码单元,框架或应用程序会作为一个独立的模块来构建和发布。在 Swift 中,一个模块可以使用import关键字导入另外一个模块。
在 Swift 中,Xcode 的每个目标(例如框架或应用程序)都被当作独立的模块处理。如果你是为了实现某个通用的功能,或者是为了封装一些常用方法而将代码打包成独立的框架,这个框架就是 Swift 中的一个模块。当它被导入到某个应用程序或者其他框架时,框架内容都将属于这个独立的模块。
源文件:
源文件就是 Swift 中的源代码文件,它通常属于一个模块,即一个应用程序或者框架。尽管我们一般会将不同的类型分别定义在不同的源文件中,但是同一个源文件也可以包含多个类型、函数之类的定义。
访问级别:
Swift 为代码中的实体提供了五种不同的访问级别。这些访问级别不仅与源文件中定义的实体相关,同时也与源文件所属的模块相关。
开放访问和公开访问可以访问同一模块源文件中的任何实体,在模块外也可以通过导入该模块来访问源文件里的所有实体。通常情况下,框架中的某个接口可以被任何人使用时,你可以将其设置为开放或者公开访问。
内部访问可以访问同一模块源文件中的任何实体,但是不能从模块外访问该模块源文件中的实体。通常情况下,某个接口只在应用程序或框架内部使用时,你可以将其设置为内部访问。
文件私有访问限制实体只能被所定义的文件内部访问。当需要把这些细节被整个文件使用的时候,使用文件私有访问隐藏了一些特定功能的实现细节。
私有访问限制实体只能在所定义的作用域内使用。需要把这些细节被整个作用域使用的时候,使用文件私有访问隐藏了一些特定功能的实现细节。
开放访问(open)和公开访问(public)的区别:
开放访问为最高(限制最少)访问级别,私有访问为最低(限制最多)访问级别。
开放访问只作用于类类型和类的成员(class members),它和公开访问的区别如下:
公开访问或者其他更严访问级别的类,只能在它们定义的模块内部被继承。
公开访问或者其他更严访问级别的类成员,只能在它们定义的模块内部的子类中重写。
开放访问的类,可以在它们定义的模块中被继承,也可以在引用它们的模块中被继承。
开放访问的类成员,可以在它们定义的模块中子类中重写,也可以在引用它们的模块中的子类重写。
把一个类标记为开放,显式地表明,你认为其他模块中的代码使用此类作为父类,然后你已经设计好了你的类的代码了。
//注释:class members:指定义在类一级的变量,包括实例变量和静态变量。
访问控制语法:
通过修饰符open,public,internal,fileprivate,private来声明实体的访问级别。