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

Cla*_*oft 308 syntax declaration modifier swift swift3

ObjectiveC.swift从标准库文件包含大约228行代码下面几行:

extension NSObject : Equatable, Hashable {
  /// ...
  open var hashValue: Int {
    return hash
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*n R 538

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

它适用于2016年8月7日的Swift 3快照,以及Xcode 8 beta 6.

简而言之:

  • open类是可访问的,并可以子类的定义模块之外.一open类成员是可访问可重写的定义模块的外部.
  • public类是可访问的,但不是子类化的定义模块之外.甲public类成员是可访问的,但 不可重写的定义模块的外部.

那么open是什么public曾经在以前的版本雨燕和的访问public受到限制.或者,正如Chris Lattner在SE-0177中所说 :允许区分公共访问和公共覆盖:

"开放"现在只是"比公众更公开",提供了一个非常简单和干净的模型.

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

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

  • 这是非常违反直觉的.谢谢你的总结. (54认同)
  • 所以Swift 3中的`public`就像Swift 2中的`public final`,`open`就像`public`? (15认同)
  • @Clashsoft:Swift 3中的"open"就像Swift 2中的"public"一样.Swift 3中的"public"在Swift 2中没有等效.(最后一个类根本不能被子类化,甚至不能在同一个模块中.) (15认同)
  • @MikeS苹果 - 认为不同,即使它是不必要的. (12认同)
  • 同意@MikeS,缺乏向后兼容性使这个混乱. (6认同)
  • @AlexanderMomchliov:通过一些简单的测试证实了我的理解. (3认同)
  • @MikeS如果你写完"提供一个非常简单和干净的模型",无论你做什么,它都可以. (3认同)
  • 因此,通过改变这一点,他们实际上所做的就是让“公开”*比每个编码人员所期望的更少*公开,从而提供了一个非常简单和干净的模型。 (3认同)
  • @ Abo3atef:主应用程序和每个框架都是独立的模块.例如,如果一类是在一个框架中定义的,而不是"开",那么你可以使用**在你的应用程序,但你不能*子*它. (2认同)
  • 旁注:关键字“open”来自“开放用于扩展,关闭用于修改”的概念 (2认同)

Moh*_*diq 9

阅读开放为

在其他模块中打开继承

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

来自Apple Docs:

开放访问仅适用于类和类成员,它与公共访问不同,如下所示:

  1. 具有公共访问权限或任何更严格的访问级别的类只能在定义它们的模块中进行子类化.

  2. 具有公共访问权限或任何更具限制性的访问级别的类成员只能在定义它们的模块中被子类覆盖.

  3. 开放类可以在定义它们的模块中进行子类化,也可以在导入模块的任何模块中进行子类化.

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


Sar*_*ith 7

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

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

在课堂上

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

班级成员

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

更新的必要性

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

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

有关更多详细信息,请查看Apple 访问控制文档