<aside>
🐹 1. open
允许实体被同一模块的任何源文件中实体访问,在模块外也可通过导入该模块来访问该实体。open
只能作用于类和类的成员,该级别的实体在模块外也可被继承和重写。
2. public
允许实体被同一模块的任何源文件中实体访问,在模块外也可通过导入该模块来访问该实体,但该级别的类和类的成员不能在模块外被继承和重写。
3. internal
允许实体被同一模块的任何源文件中的实体访问,但是不能被模块外的实体访问。
4. fileprivate
限制实体只能在其定义的文件内部被访问。
5. private
限制实体只能在其定义的作用域以及同一文件内的 extension
中被访问。
</aside>
<aside> 🦄 实体不能定义在具有更低访问级别的实体中。
</aside>
target
的访问级别在导入应用程序模块的语句前使用 @testable
特性,并在编译设置中勾选 Build Options -> Enable Testability
,然后编译这个应用程序模块,单元测试 target
就可以访问该应用程序模块中内部级别的实体了。
<aside>
🌀 1. 类型访问级别为 private
或 fileprivate
,那么该类型的所有成员的默认访问级别也为 private
或 fileprivate
。
2. 类型访问级别为 internal
或 public
,那么该类型的所有成员的默认访问级别为 internal
。
</aside>
元组的访问级别由元组中访问级别最严格的成员类型决定。
函数的访问级别由参数和返回值中访问级别最严格的类型决定。如果这个访问级别不符合函数定义所在环境的默认访问级别,那么就需要明确的指定该函数的访问级别。
public class SomePublicClass { // 显式 public 类
public var somePublicProperty = 0 // 显式 public 类成员
var someInternalProperty = 0 // 隐式 internal 类成员
fileprivate func someFilePrivateMethod() {} // 显式 fileprivate 类成员
private func somePrivateMethod() {} // 显式 private 类成员
}
class SomeInternalClass { // 隐式 internal 类
var someInternalProperty = 0 // 隐式 internal 类成员
fileprivate func someFilePrivateMethod() {} // 显式 fileprivate 类成员
private func somePrivateMethod() {} // 显式 private 类成员
}
fileprivate class SomeFilePrivateClass { // 显式 fileprivate 类
func someFilePrivateMethod() {} // 隐式 fileprivate 类成员
private func somePrivateMethod() {} // 显式 private 类成员
}
private class SomePrivateClass { // 显式 private 类
func somePrivateMethod() {} // 隐式 private 类成员
}
// 该函数需要显示的声明其访问级别,因为默认的访问级别为 internal,但其返回值的访问级别是 private
// 所以函数的访问级别也是 private
private func someFunction() -> (SomeInternalClass, SomePrivateClass) {
// 此处是函数实现部分
return (SomeInternalClass(), SomePrivateClass())
}