Swift 3.0 的 open,public,internal,fi

TigerJin發表於2021-09-09

open

  • open 修飾的 class 在 Module 內部和外部都可以被訪問和繼承

  • open 修飾的 func 在 Module 內部和外部都可以被訪問和過載(override)

Public

  • public 修飾的 class 在 Module 內部可以訪問和繼承,在外部只能訪問

  • public 修飾的 func 在 Module 內部可以被訪問和過載(override),在外部只能訪問

Final

  • final 修飾的 class 任何地方都不能不能被繼承

  • final 修飾的 func 任何地方都不能被 Override

總結:

現在的訪問許可權則依次為:open,public,internal,fileprivate,private。

下面是例子:

  • ModuleA.framework 中新建一個類ModuleA.swift

import Foundation/// final的含義保持不變public final class FinalClass { }// 這個類在ModuleA的範圍外是不能被繼承的,只能被訪問public class PublicClass {    
    public func testPublic() {}    
    // 這是錯誤的寫法,因為class已經不能被繼承,
    // 所以他的方法的訪問許可權不能大於類的訪問許可權
    open func testOpen() {}    
    // final的含義保持不變
    public final func testPublicFinal() {}
}// 在ModuleA的範圍外可以被繼承open class OpenClass {    // 這個屬性在ModuleA的範圍外不能被override
    public var size : Int = 0
    
    // 這個方法在ModuleA的範圍外不能被override
    public func testPublic() {}    
    // 這個方法在任何地方都可以被override
    open func testOpen() {}    
    ///final的含義保持不變
    public final func testPublicFinal() {}
}
  • 在 ModuleB.framework 中新建一個類:ModuleB.swift

  • 並且把 ModuleA.framework import 進來

import Foundationimport ModuleA// 這個寫法是錯誤的,編譯會失敗,類訪問許可權標記的是public,只能被訪問不能被繼承class SubA : PublicClass { }// 這樣寫法可以透過,Class訪問許可權為 `open`.class SubB : OpenClass {    
    // 這樣寫也會編譯失敗,因為這個方法許可權為public,不是`open'.
    override func testPublic() { }    
    // 這個方法因為在SubclassableParentClass中標記為open,所以可以這樣寫
    // 這裡不需要再宣告為open,因為這個類是internal的
    override func testOpen() { }
}

open class SubC : OpenClass {    // 這種寫法會編譯失敗
    override func testPublicFinal() { }    
    // 正確的寫法,方法也需要標記為open
    open override func testOpen() { }
}

open class SubE : OpenClass {    // 也可以顯式的指出這個方法不能再被override
    public final override func testOpen() { }
}



作者:midmirror
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2144/viewspace-2820147/,如需轉載,請註明出處,否則將追究法律責任。

相關文章