访问控制

  1. 访问控制修饰符

    1. open: 模块完全开放,在别的模块下可以进行继承后重写。
    2. public: 模块开放,在别的模块下不可以进行继承重写。
    3. internal: 只能在本模块内部使用。(默认)
    4. fileprivate: 只能在本文件内部使用。
    5. private: 只能在定义的作用域内使用。
  2. 类型的访问权限会影响实体的访问权限

open class a {
    var a = 3 // 隐式internal
}

public class b {
    var b = 3 //隐式internal
}

class c {
    var c = 3 //隐式internal
}

fileprivate class d {
    var d = 3 //隐式fileprivate
}

private class e {
    var e = 3 //隐式private
}
  1. 元组类型
    1. 元组的访问级别是其中访问级别最低的那一个。
  2. 函数类型
    1. 函数的最高访问级别是函数的参数类型,或者返回值类型中访问级别最低的。
    2. 如果默认的函数访问级别不满足那么编译器会报错。
internal class Test {
    
}

fileprivate class Test1 {
    
}

//报错
func test0() -> (Test, Test1){
    return (Test(), Test1())
}

//正常
fileprivate func test() -> (Test, Test1){
    return (Test(), Test1())
}

private func test1() -> (Test, Test1){
    return (Test(), Test1())
}
  1. 枚举类型
    枚举类型的成员和枚举类型的访问级别一致
private enum Test {
    case One, Two, Three//默认是private类型(和枚举类型的访问级别一致)
}
  1. 嵌套类型
    0. swift5.1新特性

    1. 如果外层函数是open,public,internal,那么默认内层函数是internal级别。
    2. 如果外层函数是private,那么内层函数是private级别。
  2. 子类
    子类的访问级别不能高于父类

public class A {
   fileprivate func test() {
        print("A")
    }
}

internal class B: A {
    override public func test() {
        super.test()
        print("B")
    }
}

var a = B()
a.test()
  1. 类实例的访问级别
  2. 如果用一个变量来接收一个类的实例,那么这个变量的访问级别默认是internal,如果比实例的级别高,那么会报错。
  3. 这个用来接收类实例的变量的访问级别不能高于类的访问级别。
public class A {
   fileprivate func test() {
        print("A")
    }
}

fileprivate class B: A {
    override public func test() {
        super.test()
        print("B")
    }
}

 var a = A()

 private var b = B()
b.test()
  1. get,set
    可以利用访问级别关键字来控制set方法的级别低于get方法,这样可以表现为在内部可读可写,在外部表现为只读.
struct TrackedString {
   private(set) var numberOfEdit = 0
    
    var value: String = "" {
        didSet{
            numberOfEdit += 1
        }
    }
    
    init() {
        
    }
}

var a = TrackedString()
a.value = "a"
a.value = "b"
a.value = "c"
a.value = "d"
print(a.numberOfEdit)
  1. 构造器

    1. 一个无参数的构造器,如果所处的类或者结构体是open,public,internal。那么该构造器的访问级别就是internal。如果是priavate,那么该构造器的访问级别就是internal。
    2. 如果一个结构体中的成员有一个是private,那么该结构体的默认成员逐一构造器的访问级别就是private。
    3. 其实和函数的访问级别原则一样。
  2. 协议

    1. 如果一个协议被写成public访问级别那么,该协议的遵守者也是public的类型。并且所有实现也都是public类型。也就是说协议的访问级别就是协议内容的访问级别。
    2. 协议的继承,一个子协议的访问级别最高是父协议的访问级别。
  3. 扩展

    1. 扩展的类类型的默认访问级别是和原类一致的。可以自定义也。
    2. 通过扩展遵守协议,那么协议实现部分应该和协议的定义访问级别一致,不能自定义修改。其他的方法等的访问级别和原类一致,支持自定义修改。
  4. 泛型
    泛型函数的访问级别受函数传入的泛型访问级别影响,还和约束有关系。取其中最低的访问级别。

  5. 类型别名
    类型别名的访问级别最高是原类型的级别。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章