访问控制可以限定其他源文件或模块中的代码对你的代码的访问级别。这个特性可以让我们隐藏代码的一些实现细节,并且可以为其他人可以访问和使用的代码提供接口。
Swift 中的访问控制模型基于模块和源文件这两个概念。
模块指的是独立的代码单元,框架或应用程序会作为一个独立的模块来构建和发布。在 Swift 中,一个模块可以 使用 import 关键字导入另外一个模块。
源文件就是 Swift 中的源代码文件,它通常属于一个模块,即一个应用程序或者框架。尽管我们一般会将不同的类型分别定义在不同的源文件中,但是同一个源文件也可以包含多个类型、函数之类的定义。
通过修饰符 open,public,internal,filepart,private 来声明实体的访问级别。访问级别默认为internal,一般只有在开发框架时才用到 open,public。
- 开放访问(open)和公开访问(public)可以访问同一模块源文件中的任何实体,在模块外也可以通过导入该模块来访问源文件 里的所有实体。通常情况下,框架中的某个接口可以被任何人使用时,你可以将其设置为开放或者公开访问。 (公开访问只能在模块内部继承重写,而开放访问可以在引用它的模块内继承重写)
- 内部访问(internal)可以访问同一模块源文件中的任何实体,但是不能从模块外访问该模块源文件中的实体。通常情况 下,某个接口只在应用程序或框架内部使用时,你可以将其设置为内部访问。
- 文件私有访问(filepart)限制实体只能被所定义的文件内部访问。当需要把这些细节被整个文件使用的时候,使用文件 私有访问隐藏了一些特定功能的实现细节。
- 私有访问(private)限制实体只能在所定义的作用域内使用。需要把这些细节被整个作用域使用的时候,使用文件私有 访问隐藏了一些特定功能的实现细节。
一个类型的访问级别也会影响到类型成员(属性、方法、构造器、下标)的默认访问级别,类型成员级别不能高于类型级别。如果你将类型指定为私有或者文件私有级别,那么该类型的所有成员的默认访问级别也会变成私有或者文件私有级别。如果你将类型指定为公开或者内部访问级别(或者不明确指定访问级别,而使用默认的内部访问级别),那么该类型的所有成员的默认访问级别将是内部访问。
子类访问级别不能高于父类访问级别。
可以单独为set方法提供更低的权限。
public private(set) var numberOfEdits = 0 //get 方法权限为public,但set方法权限为private