访问控制
限制其他源文件和模块对你的代码的访问。这个特性允许你隐藏代码的实现细节
,并指定一个偏好的接口让其他代码可以访问和使用。
模块和源文件
Swift 的访问控制模型基于模块和源文件
的概念。
-
模块
是单一的代码分配单元——一个框架或应用程序会作为的独立的单元构建和发布并且可以使用 Swift 的import
关键字导入到另一个模块。 -
源文件
是一个模块中的单个 Swift 源代码文件
(实际上,是一个应用程序或是框架中的单个文件)。虽然通常在单独源文件中定义单个类型,但是一个源文件可以包含多个类型。函数等的定义。
访问级别
Swift 为代码的实体提供个五个不同的访问级别
。这些访问级别和定义实体的源文件相关,并且也和源文件所属的模块相关。
-
private
:访问级别仅在当前定义的作用域内有效
(单例中使用过)
//private:访问级别`仅在当前定义的作用域内有效
class HTTeacher{
static let shareInstance = HTTeacher()
private init(){}
}
var t = HTTeacher.shareInstance
-
filePrivate
:访问限制仅限制在当前定义的源文件中
-
Internal
:默认访问级别,允许实体被定义模块中的任意源文件访问,但不能被该模块之外的任何源文件访问。通常在定义应用程序或是框架的内部结构时使用。(例如import Foundation
,其中Foundation
就是一个模块) -
public
:开放式访问,允许实体被定义模块中的任意源文件访问,同样可以被另一模块的源文件通过导入该定义模块来访问。但是只能在定义的模块中继承和子类重写 -
open
:最不受限制的访问级别,可以在任意地方、任意模块间被继承、定义、重写
public与open的区别
- public 访问,或任何更严格的访问级别的类,
只能在其定义模块中被继承
。 - public 访问,或任何更严格访问级别的类成员,
只能被其定义模块的子类重写
。 - open 类可以在其定义模块中被继承,也可在任何导入定义模块的其他模块中被继承。
- open 类成员可以被其定义模块的子类重写,也可以被导入其定义模块的任何模块重写。
访问级别的指导准则
Swift 中的访问级别遵循一个总体指导准则:实体不可以被更低(限制更多)访问级别的实体定义
。
- 一个 public 的变量其类型的访问级别不能是 internal, file-private 或是 private,因为在使用 public 变量的地方可能没有这些类型的访问权限。
- 一个函数不能比它的参数类型和返回类型访问级别高,因为函数可以使用的环境而其参数和返回类型却不能使用。
总结
- 没有写访问控制权限关键字时,
默认
的访问权限是internal
- 访问控制权限
从高到低
的顺序:open > public > internal > filePrivate > private
- 1、
private
:访问级别仅在当前定义的作用域内有效
- 2、
filePrivate
:访问限制仅限制在当前定义的源文件中
- 3、
internal
:默认访问级别,允许定义模块中的任意源文件访问,但不能被该模块之外的任何源文件访问 - 4、
public
:开放式访问,使我们能够在其定义模块的任何源文件中使用代码,并且可以从另一个源文件访问源文件。但是只能在定义的模块中继承和子类重写
- 5、
open
:最不受限制的访问级别,可以在任意地方、任意模块间被继承、定义、重写
- 1、