swift中的訪問控制模型基于模塊和源文件的概念,這篇文章我們需要搞清楚一下幾個問題:
- swift 訪問控制分類
- 注意事項
- 關鍵字
模塊和源文件
swift中一個模塊指的是一個framwork或者一個target,我們常見的UIKit
就是一個模塊
源文件當然就是指一個代碼文件了,swiftController.swift
訪問控制分類
-
public
同一模塊的所有實體均可訪問,不同模塊的任何實體 -
internal
同一模塊內的任何實體 -
private
同一源文件,而不是同一個類,因為一個原文件愛你可以定義多個類
注意事項
默認的訪問控制級別為
internal
元組中使用最嚴格的訪問控制,如果
internal
和private
,則整個就是private
函數的訪問級別是由參數和返回參數的訪問級別決定,而不是他自身的級別,如:函數 funcA 返回參數的級別為
private
則函數是private
的,必須明確指明其訪問級別枚舉成員的訪問級別和枚舉本身一樣
在繼承層次中,子類的訪問級別不能高于父類的
但是,可以通過override
來重寫父類的函數來提高訪問級別常量,變量,屬性,下標訪問級別是
private
,則需明確限定,另外他們的訪問級別也不能高于他所屬的類自定義構造函數的訪問級別<= 所屬類的訪問級別,必要構造函數則必須和類的級別一樣(你懂得)
結構體的訪問級別受限于其存儲的屬性的級別,如果有一個為
private
則該結構體就是private
協議繼承--如果定義了一個繼承自其他協議的新協議,那么新協議擁有的訪問級別最高也只能和被繼承協議的訪問級別相同,采用寫協議的類的訪問級別是協議的最低級別
擴展--你可以在訪問級別允許的情況下對類、結構體、枚舉進行擴展。擴展成員具有和原始類型成員一致的訪問級別。或者,你可以明確指定擴展的訪問級別(例如,
private extension
),從而給該擴展中的所有成員指定一個新的默認訪問級別。這個新的默認訪問級別仍然可以被單獨指定的訪問級別所覆蓋通過擴展添加協議一致性
如果你通過擴展來采納協議,那么你就不能顯式指定該擴展的訪問級別了。協議擁有相應的訪問級別,并會為該擴展中所有協議要求的實現提供默認的訪問級別。泛型
泛型類型或泛型函數的訪問級別取決于泛型類型或泛型函數本身的訪問級別,還需結合類型參數的類型約束的訪問級別,根據這些訪問級別中的最低訪問級別來確定。類型別名
你定義的任何類型別名都會被當作不同的類型,以便于進行訪問控制。類型別名的訪問級別不可高于其表示的類型的訪問級別。例如,private 級別的類型別名可以作為 public ,internal,private 類型別名,但是 public級別的類型別名只能作為 public類型的別名,不能作為 internal或 private 類型的別名
關鍵字
private(set)
setter 方法為private
public private(set)
setter為private getter為public