2016-08-14 77 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. 公开班级成员可以在其定义的模块中以及 导入定义模块的任何模块中被子类 覆盖。