ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

在这种情况下 open var 是什么意思,或者一般来说 open 关键字是什么?

可能相关:stackoverflow.com/questions/24003918/…(“openpublic 有什么区别?”)
旁注:关键字“open”来自“对扩展开放,对修改关闭”的概念

M
Marián Černý

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

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

它在 2016 年 8 月 7 日的 Swift 3 快照和 Xcode 8 beta 6 中可用。

简而言之:

开放类在定义模块之外是可访问的和可子类化的。开放类成员在定义模块之外是可访问和可覆盖的。

公共类是可访问的,但不能在定义模块之外进行子类化。公共类成员在定义模块之外是可访问的,但不可覆盖。

所以 open 是以前的 Swift 版本中的 public,并且 public 的访问受到了限制。或者,正如 Chris Lattner 在 SE-0177: Allow distinguishing between public access and public overridability 中所说:

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

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

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


那么 Swift 3 中的 public 就像 Swift 2 中的 public final,而 open 就像 public
@Clashsoft:Swift 3 中的“open”就像 Swift 2 中的“public”。Swift 3 中的“public”在 Swift 2 中没有等价物。(最终类根本不能子类化,即使在同一个模块中也不能。)
这是可笑的违反直觉。谢谢你的总结。
同意@MikeS,缺乏向后兼容性使这变得一团糟。
@MikeS apple - 不同的想法,即使它是不必要的。
R
Raj Pawan Gumdal

阅读打开为

在其他模块中开放继承

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

Apple Docs

开放访问仅适用于类和类成员,它与公共访问的区别如下:具有公共访问权限或任何更多限制访问级别的类只能在定义它们的模块内进行子类化。具有公共访问权限或任何更多限制性访问级别的类成员只能在定义它们的模块内被子类覆盖。开放类可以在定义它们的模块中进行子类化,也可以在导入它们定义的模块的任何模块中进行子类化。开放类成员可以被定义它们的模块中的子类以及导入定义它们的模块的任何模块中的子类覆盖。


G
GenericJam

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

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

在课堂上

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

班级成员

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

本次更新的必要性

某些类的库和框架并非设计为子类化,这样做可能会导致意外行为。原生 Apple 库也不允许覆盖相同的方法和类,

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

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


R
Rajasekaran Gopal

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

开放类在定义模块之外是可访问和可子类化的。开放类成员在定义模块之外是可访问和可覆盖的。


W
William

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