最近在學習swift中...看到 fileprivate關鍵字,因而去好好研究了下,發現一篇講解的還不錯的文章,這裏直接就分享給你們。程序員
在swift 3中新增長了兩中訪問控制權限 fileprivate
和 open
。下面將對這兩種新增訪問控制作詳細介紹。swift
在原有的swift中的 private
其實並非真正的私有,若是一個變量定義爲private,在同一個文件中的其餘類依然是能夠訪問到的。這個場景在使用extension的時候很明顯。安全
class User { private var name = "private" } extension User{ var accessPrivate: String { return name } }
這樣帶來了兩個問題:ide
由此,在swift 3中,新增長了一個 fileprivate
來顯式的代表,這個元素的訪問權限爲文件內私有。過去的private對應如今的fileprivate。如今的private則是真正的私有,離開了這個類或者結構體的做用域外面就沒法訪問。學習
open則是彌補public語義上的不足。
如今的pubic有兩層含義:編碼
繼承是一件危險的事情。尤爲對於一個framework或者module的設計者而言。在自身的module內,類或者屬性對於做者而言是清晰的,可否被繼承或者override都是可控的。可是對於使用它的人,做者有時會但願傳達出這個類或者屬性不該該被繼承或者修改。這個對應的就是 final
。spa
final
的問題在於在標記以後,在任何地方都不能override。而對於lib的設計者而言,但願獲得的是在module內能夠被override,在被import到其餘地方後其餘用戶使用的時候不能被override。設計
這就是 open
產生的初衷。經過open和public標記區別一個元素在其餘module中是隻能被訪問仍是能夠被override。code
下面是例子:繼承
/// ModuleA: // 這個類在ModuleA的範圍外是不能被繼承的,只能被訪問 public class NonSubclassableParentClass { public func foo() {} // 這是錯誤的寫法,由於class已經不能被繼承, // 因此他的方法的訪問權限不能大於類的訪問權限 open func bar() {} // final的含義保持不變 public final func baz() {} } // 在ModuleA的範圍外能夠被繼承 open class SubclassableParentClass { // 這個屬性在ModuleA的範圍外不能被override public var size : Int // 這個方法在ModuleA的範圍外不能被override public func foo() {} // 這個方法在任何地方均可以被override open func bar() {} ///final的含義保持不變 public final func baz() {} } /// final的含義保持不變 public final class FinalClass { }
/// ModuleB: import ModuleA // 這個寫法是錯誤的,編譯會失敗 // 由於NonSubclassableParentClass類訪問權限標記的是public,只能被訪問不能被繼承 class SubclassA : NonSubclassableParentClass { } // 這樣寫法能夠經過,由於SubclassableParentClass訪問權限爲 `open`. class SubclassB : SubclassableParentClass { // 這樣寫也會編譯失敗 // 由於這個方法在SubclassableParentClass 中的權限爲public,不是`open'. override func foo() { } // 這個方法由於在SubclassableParentClass中標記爲open,因此能夠這樣寫 // 這裏不須要再聲明爲open,由於這個類是internal的 override func bar() { } } open class SubclassC : SubclassableParentClass { // 這種寫法會編譯失敗,由於這個類已經標記爲open // 這個方法override是一個open的方法,則也須要代表訪問權限 override func bar() { } } open class SubclassD : SubclassableParentClass { // 正確的寫法,方法也須要標記爲open open override func bar() { } } open class SubclassE : SubclassableParentClass { // 也能夠顯式的指出這個方法不能在被override public final override func bar() { } }
如今的訪問權限則依次爲:open,public,internal,fileprivate,private。 有的人會以爲訪問權限選擇的增長加大了語言的複雜度。可是若是咱們思考swift語言的設計目標之一就是一門安全的語言(「Designed for Safety」)就能理解此次的改動。更加明確清晰的訪問權限控制可使程序員表達出更準確的意圖,固然也迫使在編碼時思考的更加深刻。