Swift 4.0 中的访问控制(Access Control)

Swfit4.0 学习 2018-03-26 已阅 316 次

访问级别
Swift 中提供了以下五种不同的访问级别。

权限级别描述
public/open以访问同一模块源文件中的任何实体,在模块外也可以通过导入该模块来访问源文件 里的所有实体
internal默认级别,可以访问同一模块源文件中的任何实体
fileprivate限制实体只能被所定义的文件内部访问
private限制实体只能在所定义的作用域内使用

访问控制语法

public      class MyPublicClass {}
internal    class MyInternalClass {}
fileprivate class MyFilePrivateClass {}
private     class MyPrivateClass {}

public      /* let */ var MyPublicVariable = 0
internal    /* let */ var MyInternalVariable = 0
fileprivate /* let */ var MyFilePrivateVariable = 0
private     /* let */ var MyPrivateVariable = 0

public      func MyPublicFunction() {}
internal    func MyInternalFunction() {}
fileprivate func MyFilePrivateFunction() {}
private     func MyPrivateFunction() {}

访问基本原则
Swift 中的访问级别遵循一个基本原则:不可以在某个实体中定义访问级别更高的实体。

e.g.

fileprivate class MyClass {
    
    public          let num0 = 0;
    /* internal */  let num1 = 10;
    fileprivate     let num2 = 20;
    private         let num3 = 30;
}
  1. 在上面的代码中,定义了一个 fileprivate 权限的 MyClass 类,而在 MyClass 内部不可以定义访问权限更高(public、internal)的实体(变量、常量、方法、类型等)。
  2. 在实际开中即使违法了此原则,Xcode不会发出警告或者编译错误(我猜Xcode会自动修正访问权限)

自定义类型
一个类型的访问级别也会影响到类型成员(属性、方法、构造器、下标)的默认访问级别。

e.g.

fileprivate class MyModel {
    
    var name: String?
    var age: Int?
}
在上面的代码中,定义了一个 fileprivate 权限的 MyModel 模型,而 MyModel 内部的 name和age 并没有显式指定访问级别,但不是默认访问级别(internal), 而是 fileprivate 访问级别。

本文由 Harvey 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论