标准库中的ObjectiveC.swift文件包含围绕228行的以下几行代码:

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


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

评论

可能相关:stackoverflow.com/questions/24003918/…(“公开和公开之间有什么区别?”)

旁注:关键字“打开”来自“打开扩展,关闭修改”的概念

#1 楼

open是Swift 3中的一个新访问级别,它随



SE-0117的实现而引入它可用于2016年8月7日的Swift 3快照,以及Xcode 8 beta6。

简而言之:在
定义模块之外,可以访问该类并可以将其归类。一个open类成员是可访问的,并且可以在定义模块之外覆盖。
一个open类是可访问的,但不能在定义模块之外进行子类化。一个public类成员是可访问的,但在定义模块之外不可重写。受到限制。
或者,如Chris Lattner在
SE-0177中所述:允许区分公共访问和公共可重写性:


现在“开放”就是“


在您的示例中,public是可访问的属性,可以在open子类中覆盖。

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

评论


因此,Swift 3中的public就像Swift 2中的public final一样,而open就像public?

– Clashsoft
16年8月15日在12:35

@Clashsoft:Swift 3中的“ open”就像Swift 2中的“ public”一样。Swift3中的“ public”在Swift 2中没有等效项。

–马丁R
16年8月15日在12:38

这是荒谬的直觉。感谢您的总结。

– GoldenJoe
16-09-13在6:06

同意@MikeS,并且缺乏向后兼容性,这使事情变得一团糟。

–HughHughTeotl
16-09-23在10:23

@MikeS苹果-认为有所不同,即使不必要。

–瓦伦·纳特(Varun Nath)
16-10-18在7:14

#2 楼

阅读open as

open以便在其他模块中继承

我重复open以便在其他模块中继承。包括定义模块。开放变量和函数开放以在其他模块中覆盖。它是限制性最小的访问级别。它与公共访问一样好,除了为其他模块中的继承而关闭的公共对象。
从Apple Docs:

开放访问仅适用于类和类成员,并且有所不同可以从公共访问中进行如下操作:


具有公共访问权限的类,或者具有更高限制的访问级别,只能在定义它们的模块内进行子类化。 >

具有公共访问权限或更高限制访问权限的类成员,只能在定义了子类的模块中被子类覆盖。


打开类可以在定义它们的模块内以及在导入定义了模块的任何模块内子类化。


开放类成员可以在定义它们的模块内以及在任何将定义模块导入的模块中被子类覆盖。




#3 楼

开放是一种访问级别,是为了对Swift的类继承施加限制而引入的。

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

在类中

开放类可以在在定义类的模块中导入定义类的模块。在类成员中
在类成员中也是如此。打开的方法可以在其定义的模块中以及在导入该方法的模块中定义的模块中的子类覆盖。

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

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

有关更多详细信息,请参见在Apple文档中的访问控制上

#4 楼

在处理多个模块时,open就可以发挥作用。在定义模块外部可以访问和重写一个开放类成员。

#5 楼

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

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


然后在任何视图控制器中,只需调用

Utils.printHello()


评论


这个答案没有说明它与公开的区别,因为您也可以通过公开来做到这一点。

–乔斯·拉米雷斯(Jose Ramirez)
17-10-23在16:40

需要更多的解释

– MD Aslam Ansari
17年12月29日在7:15

#6 楼

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