ObjectiveC.swift
来自标准库的文件包含围绕第228行的以下几行代码:
extension NSObject : Equatable, Hashable {
/// ...
open var hashValue: Int {
return hash
}
}
open var
在这种情况下是什么意思,或者open
通常是什么关键字?
ObjectiveC.swift
来自标准库的文件包含围绕第228行的以下几行代码:
extension NSObject : Equatable, Hashable {
/// ...
open var hashValue: Int {
return hash
}
}
open var
在这种情况下是什么意思,或者open
通常是什么关键字?
Answers:
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。
public
在Swift 3中就像public final
在Swift 2中一样,open
就像public
吗?
阅读为
在其他模块中开放继承
我在其他模块中重复开放继承。因此,打开了一个开放类,以便在其他包含定义模块的模块中进行子类化。开放变量和函数开放以在其他模块中覆盖。它是限制性最小的访问级别。就像公共访问接受那样,公共的内容对于其他模块中的继承是封闭的,这是很好的。
开放式访问仅适用于班级和班级成员,它与公共访问有所不同,如下所示:
具有公共访问权限或更高级别的访问权限的类只能在定义它们的模块内被子类化。
具有公共访问权限或任何更高访问权限级别的类成员只能在定义它们的模块内被子类覆盖。
开放类可以在定义它们的模块内以及在导入定义它们的模块的任何模块内子类化。
- 开放类成员可以由定义它们的模块内的子类以及导入定义它们的模块的任何模块内的子类覆盖。
除子类外,open class func
还可以从项目中的任何位置访问an 。假设您正在像这样在Util类中定义一个开放类函数
open class Utils: NSObject {
open class func printHello() {
print("Hello from utils")
}
}
然后,在您的任何视图控制器中,只需调用以下内容即可访问此方法
Utils.printHello()
处理多个模块时,open可以发挥作用。
在定义模块之外,开放类是可访问和可子类化的。一个开放类的成员在定义模块之外是可访问和可重写的。
open
和之间有什么区别public
?”)