什么是'开放' Swift中的关键字?

时间:2016-08-14 22:17:37

标签: swift swift3 syntax declaration modifier

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

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

open var在此上下文中的含义是什么,或者open关键字一般是什么?

6 个答案:

答案 0 :(得分:513)

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

2016年8月7日起,它可以与Swift 3快照一起提供, 和Xcode 8 beta 6。

简而言之:

  • open可访问子类以外 定义模块。 open类成员可访问可覆盖的在定义模块之外。
  • public可访问不是子类 定义模块。 public类成员可访问但是 在定义模块之外不可覆盖

所以open是之前public的原因 Swift版本和public的访问受到限制。 或者,正如Chris Lattner所说的那样 SE-0177: Allow distinguishing between public access and public overridability

  

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

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

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

答案 1 :(得分:7)

开头阅读
  

在其他模块中打开继承

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

来自Apple Docs

  

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

     
      
  1. 具有公共访问权限或更严格的访问级别的类可以   仅在定义它们的模块中进行子类化。

  2.   
  3. 具有公共访问权限或更严格的访问级别的类成员可以   只能在它们所在的模块中被子类覆盖   定义

  4.   
  5. 开放类可以在定义它们的模块中进行子类化,也可以在任何导入模块的模块中进行子类化   他们被定义了。

  6.   
  7. 子类可以覆盖开放类成员   在他们定义的模块内,以及在任何模块中   导入定义它们的模块。
  8.   

答案 2 :(得分:4)

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

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

在课程中

开放类可以在定义的模块中以及导入定义类的模块的模块中进行子类化。

在班级成员中

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

需要此次更新

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

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

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

答案 3 :(得分:1)

在处理多个模块时要发挥开放作用。

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

答案 4 :(得分:0)

除了子类,还可以从项目的任何位置访问open class func。假设您正在Util类中定义一个开放类函数,如此

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

然后,在视图控制器的任何位置,只需调用

即可访问此方法
Utils.printHello()

答案 5 :(得分:0)

open仅适用于另一个模块,例如:可可豆或单元测试,我们可以继承或覆盖