-
訪問控制修飾符
- open: 模塊完全開放,在別的模塊下可以進行繼承後重寫。
- public: 模塊開放,在別的模塊下不可以進行繼承重寫。
- internal: 只能在本模塊內部使用。(默認)
- fileprivate: 只能在本文件內部使用。
- private: 只能在定義的作用域內使用。
-
類型的訪問權限會影響實體的訪問權限
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
}
- 元組類型
- 元組的訪問級別是其中訪問級別最低的那一個。
- 函數類型
- 函數的最高訪問級別是函數的參數類型,或者返回值類型中訪問級別最低的。
- 如果默認的函數訪問級別不滿足那麼編譯器會報錯。
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())
}
- 枚舉類型
枚舉類型的成員和枚舉類型的訪問級別一致
private enum Test {
case One, Two, Three//默認是private類型(和枚舉類型的訪問級別一致)
}
-
嵌套類型
0. swift5.1新特性- 如果外層函數是open,public,internal,那麼默認內層函數是internal級別。
- 如果外層函數是private,那麼內層函數是private級別。
-
子類
子類的訪問級別不能高於父類
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()
- 類實例的訪問級別
- 如果用一個變量來接收一個類的實例,那麼這個變量的訪問級別默認是internal,如果比實例的級別高,那麼會報錯。
- 這個用來接收類實例的變量的訪問級別不能高於類的訪問級別。
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()
- 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)
-
構造器
- 一個無參數的構造器,如果所處的類或者結構體是open,public,internal。那麼該構造器的訪問級別就是internal。如果是priavate,那麼該構造器的訪問級別就是internal。
- 如果一個結構體中的成員有一個是private,那麼該結構體的默認成員逐一構造器的訪問級別就是private。
- 其實和函數的訪問級別原則一樣。
-
協議
- 如果一個協議被寫成public訪問級別那麼,該協議的遵守者也是public的類型。並且所有實現也都是public類型。也就是說協議的訪問級別就是協議內容的訪問級別。
- 協議的繼承,一個子協議的訪問級別最高是父協議的訪問級別。
-
擴展
- 擴展的類類型的默認訪問級別是和原類一致的。可以自定義也。
- 通過擴展遵守協議,那麼協議實現部分應該和協議的定義訪問級別一致,不能自定義修改。其他的方法等的訪問級別和原類一致,支持自定義修改。
-
泛型
泛型函數的訪問級別受函數傳入的泛型訪問級別影響,還和約束有關係。取其中最低的訪問級別。 -
類型別名
類型別名的訪問級別最高是原類型的級別。