swift 访问控制(open、public、internal、

2019-05-29  本文已影响0人  皆为序幕_

访问控制

访问控制:用来控制代码是否需要暴露给调用方的一种设置,比如可以隐藏一些代码的实现细节等等

注意
为了简单起见,对于代码中可以设置访问级别的特性(属性、基本类型、函数等),在下面的内容中我们会称之为“实体”


模块和源文件

Swift 中的访问控制模型基于模块源文件这两个概念。

访问级别

内容 说明
Open 只能作用于类和类的成员,可以被任何人使用,包括重写和继承
Public 可以被任何人使用。但其他模块中不可以被重写和继承,而在本模块内可以被重写和继承
Internal(默认访问级别,修饰符可写可不写) 所修饰的属性或方法在源代码所在的整个模块都可以访问。如果是框架或者库代码,则在整个框架内部都可以访问,框架由外部代码所引用时,则不可以访问。如果是App代码,也是在整个App代码,也是在整个App内部可以访问
File-private 所修饰的属性或者方法在当前的源文件里可以访问
Private 访问级别所修饰的属性或者方法只能在当前类里访问

Open 为最高访问级别(限制最少),Private 为最低访问级别(限制最多)。


访问控制语法

public class SomePublicClass {}
internal class SomeInternalClass {}
fileprivate class SomeFilePrivateClass {}
private class SomePrivateClass {}

public var somePublicVariable = 0
internal let someInternalConstant = 0
fileprivate func someFilePrivateFunction() {}
private func somePrivateFunction() {}

自定义类型

fileprivate class SomeFilePrivateClass {        
    func someFilePrivateMethod() {}              
    func somePrivateMethod() {}         
}

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 类成员
}

子类

public class ClassA{
    fileprivate func run(){
        
    }
}

internal class ClassB:ClassA{
    override internal func run(){
        super.run()
    }
}

常量、变量、属性、下标

常量、变量、属性不能拥有比它们的类型更高的访问级别,比如定义一个public 级别的属性,那么它的访问级别不能是Internal

构造器

-自定义构造器的访问级别可以低于或等于其所属类的访问级别。唯一的例外是必要构造器,它的访问级别必须和所属类型的访问级别相同


协议


分类


泛型

泛型类型或泛型函数的访问级别取决于泛型类型或泛型函数本身的访问级别,还需结合类型参数的类型约束的访问级别,根据这些访问级别中的最低访问级别来确定

上一篇 下一篇

猜你喜欢

热点阅读