概述
隐藏实现机制,仅暴露对应的接口和 API 给外部调用者,是面向对象的最佳实践之一。访问控制机制(Access Control)是实现此机制的利器之一。类似于 c++、Java、C#等,Swift 语言也加入了访问控制机制,而且颗粒度更细,以便对代码进行更精细化的控制。
访问控制的施加对象
- 类型(individual types)
- 类 (class)
- 结构 (structure)
- 枚举 (enumration)
- 类型之
- 属性 (property)
- 方法 (method)
- 初始化器 (initializer)
- 下标 (subscript)
模块和源文件
- 模块(module) 指的是一个单独的代码发布单元,例如 framework、app、package等。其特征是可以在其他模块中使用 import 关键字导入和使用。
- 源文件(source file) 指的是一个单独的 Swift 源代码文件,通常在模块或者 app 中。
访问控制表
Access Level (访问级别) |
继承和 override | 外部 (App等) |
module (模块) |
source file (当前代码文件) |
类/结构 | 说明 |
---|---|---|---|---|---|---|
open | 最高等级。在外部模块中,可以继承,也可以 override。 | |||||
public | 公开。在外部模块中,不可继承和 override。 | |||||
internal |
缺省访问控制级别。 模块内部均可访问。 |
|||||
fileprivate | 仅当前源文件内部访问。 | |||||
private | 仅当前源代码的当前类、结构内部访问。 |
访问级别的基本原则
Swift 的访问级别遵循一条基本原则:实体不能被定义在低访问级别的实体中。
例如:
- public 变量不能定义在 internal 类型中
- 函数的访问级别不能高于其参数和返回值的最低访问级别
例外情况是在单元测试中,测试案例可以访问任何内部实体。
访问控制语法
open class SomeOpenClass {}
public class SomePublicClass {}
internal class SomeInternalClass {}
fileprivate class SomeFilePrivateClass {}
private class SomePrivateClass {}
open var someOpenVariable = 0
public var somePublicVariable = 0
internal let someInternalConstant = 0
fileprivate func someFilePrivateFunction() {}
private func somePrivateFunction() {}