在swift中Access Control可分為5個層級。由層級最高到層級最低依次為open / public / internal / file-private / private 。層級最高表示限制最少,層級最低表示限制最多。
在上面的連結中,清楚地介紹了每個層級的差異,如上圖所示。
open :用於宣告class以及class內所有的成員,層級最高,所有module和source file都可取得,且可subclass和override此class。
public:不限於class,所有module和source file都可取得,但若為class,則不可subclass和override。
internal:宣告的module內所有source file才可取得,module外無法取得。module內所有source file,若為class,可subclass和override。同時,此為預設的access control,也就代表預設的層級只能用於你寫的module內,在module外無法取得。
fileprivate:宣告的source file內才可取得,若為class,可subclass和override。
private :宣告的區塊內才可取得,也就是{ } 內才可取得。若為class,可subclass和override。
fileprivate和private的差異,舉個最明顯的例子。
在viewController.swift的檔案中,宣告為fileprivate的屬性fileprivateProperty和private的屬性privateProperty。
在viewDidLoad中,也就是宣告的{ }範圍內,fileprivateProperty和privateProperty皆可進行修改。
但在同一個viewController.swift的檔案中撰寫VIewController的extention,內部只能取的fileprivateProperty,無法取得privateProperty。
lass ViewController: UIViewController { | |
fileprivate var fileprivateProperty : String = "" | |
private var privateProperty : String = "" | |
override func viewDidLoad() { | |
super.viewDidLoad() | |
fileprivateProperty = "hello~" | |
privateProperty = "hello~~" | |
// Do any additional setup after loading the view, typically from a nib. | |
} | |
} | |
extension ViewController{ | |
func someFunction(){ | |
fileprivateProperty = "hi~~" | |
//無法取得privateProperty | |
} | |
} |
以上為5種層級的介紹,在宣告各種class / struct / protocol…..的過程中,只要把握一個原則,內部成員的層級不能高於最外圍的成員。
舉例來說,宣告了一個 fileprivate的class,內部的成員可以為fileprivate或private,但絕不能為open。
fileprivate class SomeClass{
fileprivate var name : String = “John”
privete var age : Int = 18
open var height : Int = 180 //這行程式碼絕對不能通過
}
沒有留言:
張貼留言