标准库中的 ObjectiveC.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 中可用。
简而言之:
开放类在定义模块之外是可访问的和可子类化的。开放类成员在定义模块之外是可访问和可覆盖的。
公共类是可访问的,但不能在定义模块之外进行子类化。公共类成员在定义模块之外是可访问的,但不可覆盖。
所以 open
是以前的 Swift 版本中的 public
,并且 public
的访问受到了限制。或者,正如 Chris Lattner 在 SE-0177: Allow distinguishing between public access and public overridability 中所说:
“开放”现在只是“比公共更公开”,提供了一个非常简单和干净的模型。
在您的示例中,open var hashValue
是一个可访问的属性,并且可以在 NSObject
子类中被覆盖。
有关更多示例和详细信息,请查看 SE-0117。
阅读打开为
在其他模块中开放继承
我在其他模块中重复打开继承。因此,一个开放类对于包含定义模块的其他模块中的子类化是开放的。开放的变量和函数是开放的,可以在其他模块中覆盖。它是限制最少的访问级别。它与公共访问一样好,只是公共的东西在其他模块中被关闭以继承。
从 Apple Docs:
开放访问仅适用于类和类成员,它与公共访问的区别如下:具有公共访问权限或任何更多限制访问级别的类只能在定义它们的模块内进行子类化。具有公共访问权限或任何更多限制性访问级别的类成员只能在定义它们的模块内被子类覆盖。开放类可以在定义它们的模块中进行子类化,也可以在导入它们定义的模块的任何模块中进行子类化。开放类成员可以被定义它们的模块中的子类以及导入定义它们的模块的任何模块中的子类覆盖。
Open 是一个访问级别,被引入是为了对 Swift 上的类继承施加限制。
这意味着开放访问级别只能应用于类和类成员。
在课堂上
一个开放的类可以在它定义的模块和导入定义类的模块的模块中进行子类化。
班级成员
这同样适用于班级成员。 open 方法可以被定义它的模块中的子类和导入定义该方法的模块的模块中的子类覆盖。
本次更新的必要性
某些类的库和框架并非设计为子类化,这样做可能会导致意外行为。原生 Apple 库也不允许覆盖相同的方法和类,
因此,在此添加之后,他们将相应地应用公共和私人访问级别。
有关更多详细信息,请查看 Apple Documentation on Access Control
处理多个模块时打开来玩。
开放类在定义模块之外是可访问和可子类化的。开放类成员在定义模块之外是可访问和可覆盖的。
open 仅针对另一个模块,例如:cocoa pods,或单元测试,我们可以继承或覆盖
public
就像 Swift 2 中的public final
,而open
就像public
?