參考了 沒故事的卓同學(xué) 的文章:Swift 3必看:新的訪問控制fileprivate和open , 替換了一個更為直觀的例子
open
- open 修飾的 class 在 Module 內(nèi)部和外部都可以被訪問和繼承
- open 修飾的 func 在 Module 內(nèi)部和外部都可以被訪問和重載(override)
Public
- public 修飾的 class 在 Module 內(nèi)部可以訪問和繼承,在外部只能訪問
- public 修飾的 func 在 Module 內(nèi)部可以被訪問和重載(override),在外部只能訪問
Final
- final 修飾的 class 任何地方都不能不能被繼承
- final 修飾的 func 任何地方都不能被 Override
總結(jié):
現(xiàn)在的訪問權(quán)限則依次為:open惩猫,public芝硬,internal,fileprivate帆锋,private吵取。
下面是例子:
- ModuleA.framework 中新建一個類ModuleA.swift
import Foundation
/// final的含義保持不變
public final class FinalClass { }
// 這個類在ModuleA的范圍外是不能被繼承的,只能被訪問
public class PublicClass {
public func testPublic() {}
// 這是錯誤的寫法锯厢,因?yàn)閏lass已經(jīng)不能被繼承皮官,
// 所以他的方法的訪問權(quán)限不能大于類的訪問權(quán)限
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 進(jìn)來
import Foundation
import ModuleA
// 這個寫法是錯誤的脯倒,編譯會失敗,類訪問權(quán)限標(biāo)記的是public,只能被訪問不能被繼承
class SubA : PublicClass { }
// 這樣寫法可以通過,Class訪問權(quán)限為 `open`.
class SubB : OpenClass {
// 這樣寫也會編譯失敗,因?yàn)檫@個方法權(quán)限為public捺氢,不是`open'.
override func testPublic() { }
// 這個方法因?yàn)樵赟ubclassableParentClass中標(biāo)記為open威创,所以可以這樣寫
// 這里不需要再聲明為open虽界,因?yàn)檫@個類是internal的
override func testOpen() { }
}
open class SubC : OpenClass {
// 這種寫法會編譯失敗
override func testPublicFinal() { }
// 正確的寫法法希,方法也需要標(biāo)記為open
open override func testOpen() { }
}
open class SubE : OpenClass {
// 也可以顯式的指出這個方法不能再被override
public final override func testOpen() { }
}