2017年3月13日 星期一

access control

Ref : https://medium.com/@jerrywang0420/access-control-%E6%95%99%E5%AD%B8-swift-3-ios-4d93ee567eb0#.esuh0lceq


在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 //這行程式碼絕對不能通過
}



沒有留言:

張貼留言