什么是Swift中的“open”关键字?

标准库中的ObjectiveC.swift文件在第228行附近包含以下几行代码:

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

在这种情况下, open var意味着什么,或者一般的open关键字是什么?

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

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

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

简而言之:

  • 一个open类在定义模块之外是可访问和可分类的。 一个open类成员可以在定义模块之外访问覆盖
  • public类是可访问的,不能在定义模块之外进行子类化public类成员是可访问的,不能在定义模块之外进行覆盖

所以open是以前的Swift版本中public的, public访问受到限制。 或者,正如克里斯·莱特纳(Chris Lattner)在SE-0177中所说的:允许区分公共访问和公众可重写 :

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

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

有关更多示例和详细信息,请参阅SE-0117 。

除了子类外,还可以从项目中的任何位置访问open class func 。 假设你正在像这样在你的Util类中定义一个打开的类函数

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

然后在你的视图控制器的任何地方,你可以通过调用简单地访问这个方法

 Utils.printHello() 

Open是一个访问级别,被引入来对Swift的类inheritance施加限制。

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

在类中

一个开放的类可以在它定义的模块和导入定义类的模块的模块中进行子类化。

在class级成员

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

这个更新的需要

一些类库和框架不是被devise成子类的,这样做可能会导致意想不到的行为。 原生苹果库也不允许覆盖相同的方法和类,

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

有关更多详细信息,请参阅有关访问控制的Apple文档

阅读为开放

在其他模块中打开inheritance

我重复在其他模块中inheritance。 所以在其他包含定义模块的模块中打开一个打开的类来进行子类化。 打开variables和函数在其他模块中覆盖。 它是限制最less的访问级别。 这与公共访问一样好,接受一些公开的东西在其他模块中被closuresinheritance。

从苹果文件

开放获取只适用于class级和class级成员,它与公共访问的区别如下:

  1. 具有公共访问权限的类别或任何更具限制性的访问权限级别只能在其定义的模块中进行分类。

  2. 具有公共访问权限或具有更多限制性访问级别的类成员只能在其定义的模块内被子类覆盖。

  3. 开放类可以被定义在它们定义的模块中,也可以定义在任何导入模块的模块中。

  4. 打开的类成员可以被它们定义的模块中的子类覆盖,也可以在任何导入定义模块的模块中覆盖。