Swift 中的 'open' 关键字是什么?

What is the 'open' keyword in Swift?

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

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

open var 在此上下文中是什么意思,或者 open 关键字通常是什么?

open 是 Swift 3 中的新访问级别,随实施引入 的

2016 年 8 月 7 日的 Swift 3 快照可用, Xcode 8 beta 6.

简而言之:

  • openclass 可访问并且subclass可在 定义模块。 open class 成员 可访问 并且 可覆盖 在定义模块之外。
  • A public class 可访问 不低于 class 可访问 定义模块。 public class 成员 可访问 在定义模块之外不可覆盖

所以 open 就是 public 以前的样子 Swift 发布,public 的访问已被限制。 或者,正如 Chris Lattner 所说 SE-0177: Allow distinguishing between public access and public overridability:

“open” is now simply “more public than public”, providing a very simple and clean model.

在您的示例中,open var hashValue 是一个 属性,它可以访问并且可以在 NSObject subclasses 中被覆盖。

有关更多示例和详细信息,请查看 SE-0117

Open 是一个访问级别,引入它是为了对 class 对 Swift 的继承施加限制。

这意味着 open 访问级别只能应用于 classes 和 class 成员 .

在Classes

一个打开的 class 可以在它定义的模块中被子class,在导入定义了 class 的模块的模块中。

在Class个成员中

这同样适用于 class 成员。 open 方法可以被其定义的模块中的子classes 和导入定义该方法的模块的模块中的 es 覆盖。

此更新的必要性

某些 classes 的库和框架不适合被子classed,这样做可能会导致意外行为。本机 Apple 库也不允许覆盖相同的方法和 classes,

所以在添加之后,他们将相应地应用 public 和私有访问级别。

有关详细信息,请查看 Apple Documentation on Access Control

阅读打开方式

open for inheritance in other modules

我在其他模块重复open for inheritance。 因此,在包含定义模块的其他模块中,开放 class 可用于子 classing。开放变量和函数可以在其他模块中覆盖。它是限制最少的访问级别。它与 public 访问一样好,只是 public 的某些内容因在其他模块中的继承而关闭。

来自Apple Docs

Open access applies only to classes and class members, and it differs from public access as follows:

  1. Classes with public access, or any more restrictive access level, can be subclassed only within the module where they’re defined.

  2. Class members with public access, or any more restrictive access level, can be overridden by subclasses only within the module where they’re defined.

  3. Open classes can be subclassed within the module where they’re defined, and within any module that imports the module where they’re defined.

  4. 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.

open只针对另外一个模块比如:cocoa pods,或者单元测试,我们可以继承或者覆盖

open 在处理多个模块时发挥作用。

open class 可在定义模块之外访问和子classable。开放的 class 成员可以在定义模块之外访问和覆盖。