訪問控制

  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. 類型別名
    類型別名的訪問級別最高是原類型的級別。

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