2016-08-14 101 views

回答

406

open是斯威夫特3新的接入水平, 的實施過程中引入

它可與雨燕3快照從 2016年8月7日,並與Xcode 8 beta 6.

總之:

  • open類別是可訪問子類別 定義模塊的外部。一個open類成員是可訪問覆蓋以外的定義模塊。
  • public類是訪問未子類化外 定義模塊的。 A public類成員是可訪問不可覆蓋定義模塊的外部。

那麼open是什麼public曾經在以前的 斯威夫特發行和public訪問受到限制。 或者,正如克里斯·拉特納把它放在 SE-0177: Allow distinguishing between public access and public overridability

「打開」,現在只是「比公衆更公開」,提供了一個非常簡單和乾淨的模型。

在你的榜樣,open var hashValue是可訪問,並且可以在NSObject被子類覆蓋的屬性。

有關更多示例和詳細信息,請查看SE-0117

+9

因此,Swift 3中的'public'就像Swift 2中的public final,而open更像'public'? – Clashsoft

+14

@Clashsoft:Swift 3中的「open」就像Swift 2中的「public」一樣。Swift 3中的「public」在Swift 2中沒有任何等價物。(最終的類根本就不能被繼承,即使在同一個模塊中也是如此。) –

+0

好的,謝謝澄清。 – Clashsoft

3

Open是一個訪問級別,被引入來對Swift的類繼承施加限制。

這意味着開放訪問級別只能應用於類和類成員

在類

開放類可以是在和在該導入其中類中定義的模塊的模塊中定義的模塊中被繼承。

在類成員

這同樣適用於類成員。一個打開的方法可以被其中定義的模塊中的子類以及導入定義該方法的模塊的模塊覆蓋。

此更新

庫和框架的一些類需要的不是設計爲子類,而這樣做可能會導致意外的行爲。原生蘋果庫也不會允許覆蓋相同的方法和類別,因此,在此添加之後,它們將相應地應用公共和私有訪問級別。

對於更多的細節看Apple Documentation on Access Control

2

除了子類,一個open class func也可以訪問在你的項目中的任何地方。假設你在你的Util類在您的視圖控制器的任何地方限定開放類函數這樣

open class Utils: NSObject { 
    open class func printHello() { 
     print("Hello from utils") 
    } 
} 

然後,你可以簡單地通過調用

Utils.printHello() 
+0

這個答案並不能解釋它與公衆的不同之處,因爲你也可以通過公開來做到這一點。 –

+0

需要更多關於它的解釋 –

3

閱讀開放作爲

訪問此方法

在其他模塊中繼承開放

我重複在其他模塊中繼承。 因此,在包含定義模塊的其他模塊中打開一個打開的類進行子類化。打開的變量和函數可以在其他模塊中重寫。它是限制最少的訪問級別。它與公共訪問一樣好,接受公開的某些內容在其他模塊中被繼承關閉。

Apple Docs

開放存取僅適用於類和類成員,它從公共訪問不同之處如下:

  1. 中的類的公共訪問,或者任何限制性更強的訪問級別, 只能在它們被定義的模塊中被分類。

  2. 具有公共訪問權限或限制性訪問級別的成員 僅可在 定義的模塊中被子類覆蓋。

  3. 打開的類可以在定義它們的模塊內以及在任何導入模塊的模塊中被定義爲 。

  4. 公開班級成員可以在其定義的模塊中以及 導入定義模塊的任何模塊中被子類 覆蓋。