Swift 中的 'open' 关键字是什么?
What is the 'open' keyword in Swift?
标准库中的 ObjectiveC.swift
文件在第 228 行附近包含以下几行代码:
extension NSObject : Equatable, Hashable {
/// ...
open var hashValue: Int {
return hash
}
}
open var
在此上下文中是什么意思,或者 open
关键字通常是什么?
open
是 Swift 3 中的新访问级别,随实施引入
的
2016 年 8 月 7 日的 Swift 3 快照可用,
Xcode 8 beta 6.
简而言之:
open
class 可访问并且subclass可在
定义模块。 open
class 成员 可访问 并且
可覆盖 在定义模块之外。
- A
public
class 可访问 但 不低于 class 可访问
定义模块。 public
class 成员 可访问 但
在定义模块之外不可覆盖。
所以 open
就是 public
以前的样子
Swift 发布,public
的访问已被限制。
或者,正如 Chris Lattner 所说
SE-0177: Allow distinguishing between public access and public overridability:
“open” is now simply “more public than public”, providing a very simple and clean model.
在您的示例中,open var hashValue
是一个 属性,它可以访问并且可以在 NSObject
subclasses 中被覆盖。
有关更多示例和详细信息,请查看 SE-0117。
Open 是一个访问级别,引入它是为了对 class 对 Swift 的继承施加限制。
这意味着 open 访问级别只能应用于 classes 和 class 成员 .
在Classes
一个打开的 class 可以在它定义的模块中被子class,在导入定义了 class 的模块的模块中。
在Class个成员中
这同样适用于 class 成员。 open 方法可以被其定义的模块中的子classes 和导入定义该方法的模块的模块中的 es 覆盖。
此更新的必要性
某些 classes 的库和框架不适合被子classed,这样做可能会导致意外行为。本机 Apple 库也不允许覆盖相同的方法和 classes,
所以在添加之后,他们将相应地应用 public 和私有访问级别。
有关详细信息,请查看 Apple Documentation on Access Control
阅读打开方式
open for inheritance in other modules
我在其他模块重复open for inheritance。
因此,在包含定义模块的其他模块中,开放 class 可用于子 classing。开放变量和函数可以在其他模块中覆盖。它是限制最少的访问级别。它与 public 访问一样好,只是 public 的某些内容因在其他模块中的继承而关闭。
来自Apple Docs:
Open access applies only to classes and class members, and it differs from public access as follows:
Classes with public access, or any more restrictive access level, can
be subclassed only within the module where they’re defined.
Class members with public access, or any more restrictive access level, can
be overridden by subclasses only within the module where they’re
defined.
Open classes can be subclassed within the module where they’re defined, and within any module that imports the module where
they’re defined.
Open class members can be overridden by subclasses
within the module where they’re defined, and within any module that
imports the module where they’re defined.
open只针对另外一个模块比如:cocoa pods,或者单元测试,我们可以继承或者覆盖
open 在处理多个模块时发挥作用。
open class 可在定义模块之外访问和子classable。开放的 class 成员可以在定义模块之外访问和覆盖。
标准库中的 ObjectiveC.swift
文件在第 228 行附近包含以下几行代码:
extension NSObject : Equatable, Hashable {
/// ...
open var hashValue: Int {
return hash
}
}
open var
在此上下文中是什么意思,或者 open
关键字通常是什么?
open
是 Swift 3 中的新访问级别,随实施引入
的
2016 年 8 月 7 日的 Swift 3 快照可用, Xcode 8 beta 6.
简而言之:
open
class 可访问并且subclass可在 定义模块。open
class 成员 可访问 并且 可覆盖 在定义模块之外。- A
public
class 可访问 但 不低于 class 可访问 定义模块。public
class 成员 可访问 但 在定义模块之外不可覆盖。
所以 open
就是 public
以前的样子
Swift 发布,public
的访问已被限制。
或者,正如 Chris Lattner 所说
SE-0177: Allow distinguishing between public access and public overridability:
“open” is now simply “more public than public”, providing a very simple and clean model.
在您的示例中,open var hashValue
是一个 属性,它可以访问并且可以在 NSObject
subclasses 中被覆盖。
有关更多示例和详细信息,请查看 SE-0117。
Open 是一个访问级别,引入它是为了对 class 对 Swift 的继承施加限制。
这意味着 open 访问级别只能应用于 classes 和 class 成员 .
在Classes
一个打开的 class 可以在它定义的模块中被子class,在导入定义了 class 的模块的模块中。
在Class个成员中
这同样适用于 class 成员。 open 方法可以被其定义的模块中的子classes 和导入定义该方法的模块的模块中的 es 覆盖。
此更新的必要性
某些 classes 的库和框架不适合被子classed,这样做可能会导致意外行为。本机 Apple 库也不允许覆盖相同的方法和 classes,
所以在添加之后,他们将相应地应用 public 和私有访问级别。
有关详细信息,请查看 Apple Documentation on Access Control
阅读打开方式
open for inheritance in other modules
我在其他模块重复open for inheritance。 因此,在包含定义模块的其他模块中,开放 class 可用于子 classing。开放变量和函数可以在其他模块中覆盖。它是限制最少的访问级别。它与 public 访问一样好,只是 public 的某些内容因在其他模块中的继承而关闭。
来自Apple Docs:
Open access applies only to classes and class members, and it differs from public access as follows:
Classes with public access, or any more restrictive access level, can be subclassed only within the module where they’re defined.
Class members with public access, or any more restrictive access level, can be overridden by subclasses only within the module where they’re defined.
Open classes can be subclassed within the module where they’re defined, and within any module that imports the module where they’re defined.
Open class members can be overridden by subclasses within the module where they’re defined, and within any module that imports the module where they’re defined.
open只针对另外一个模块比如:cocoa pods,或者单元测试,我们可以继承或者覆盖
open 在处理多个模块时发挥作用。
open class 可在定义模块之外访问和子classable。开放的 class 成员可以在定义模块之外访问和覆盖。