来自标准库的objective .swift文件在第228行左右包含以下几行代码:

extension NSObject : Equatable, Hashable {
  /// ...
  open var hashValue: Int {
    return hash
  }
}

在这个上下文中open var是什么意思,或者open关键字一般是什么?


open是Swift 3中一个新的访问级别,在实现中引入 的

SE-0117允许区分公共访问和公共覆盖

从2016年8月7日起,它可与Swift 3快照一起使用。 Xcode 8 beta 6。

简而言之:

类的外部可访问和可子类化开放类 定义模块。开放类成员是可访问的 在定义模块外部重写。 类之外可访问但不可子类化的公共类 定义模块。公共类成员是可访问的,但是 不能在定义模块之外重写。

所以公开就是以前的公共 迅速发布和公众访问受到限制。 或者像克里斯·拉特纳说的那样 SE-0177:允许区分公共访问和公共覆盖:

“开放”现在只是“比公共更公开”,提供了一个非常简单和干净的模型。

在你的例子中,open var hashValue是一个可以访问的属性,可以在NSObject的子类中重写。

更多的例子和细节,请看SE-0117。


Open是一个访问级别,引入它是为了限制Swift上的类继承。

这意味着开放访问级别只能应用于类和类成员。

在类

开放类可以在定义它的模块中继承,也可以在导入定义该类的模块的模块中继承。

班级成员

这同样适用于类成员。一个开放方法可以被定义它的模块中的子类覆盖,也可以被导入定义该方法的模块的模块覆盖。

更新的需要

库和框架的某些类并没有被设计成子类,这样做可能会导致意想不到的行为。原生苹果库也不允许重写相同的方法和类,

因此,在此添加之后,他们将相应地应用公共和私有访问级别。

欲了解更多细节,请参阅苹果访问控制文档


打开读如下

在其他模块中为继承打开

我在其他模块中重复为继承而打开。 因此,开放类对包含定义模块的其他模块的子类化开放。开放的变量和函数是开放的,可以在其他模块中重写。这是限制最少的访问级别。它和公共访问一样好,只是某些公共的东西在其他模块中对继承是关闭的。

来自Apple Docs:

Open access applies only to classes and class members, and it differs from public access as follows: Classes with public access, or any more restrictive access level, can be subclassed only within the module where they’re defined. Class members with public access, or any more restrictive access level, can be overridden by subclasses only within the module where they’re defined. Open classes can be subclassed within the module where they’re defined, and within any module that imports the module where they’re defined. Open class members can be overridden by subclasses within the module where they’re defined, and within any module that imports the module where they’re defined.


只开放另一个模块,例如:可可荚,或单元测试,我们可以继承或覆盖


打开来玩时处理多个模块。

开放类可以在定义模块之外访问和子类化。开放类成员可以在定义模块外部访问和重写。