访问级别

<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. 类型访问级别为 privatefileprivate,那么该类型的所有成员的默认访问级别也为 privatefileprivate。 2. 类型访问级别为 internalpublic,那么该类型的所有成员的默认访问级别为 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())
}