问题
The ObjectiveC.swift file from the standard library contains the following few lines of code around line 228:
extension NSObject : Equatable, Hashable {
/// ...
open var hashValue: Int {
return hash
}
}
What does open var
mean in this context, or what is the open
keyword in general?
回答1:
open
is a new access level in Swift 3, introduced with the implementation
of
- SE-0117 Allow distinguishing between public access and public overridability
It is available with the Swift 3 snapshot from August 7, 2016, and with Xcode 8 beta 6.
In short:
- An
open
class is accessible and subclassable outside of the defining module. Anopen
class member is accessible and overridable outside of the defining module. - A
public
class is accessible but not subclassable outside of the defining module. Apublic
class member is accessible but not overridable outside of the defining module.
So open
is what public
used to be in previous
Swift releases and the access of public
has been restricted.
Or, as Chris Lattner puts it in
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.
In your example, open var hashValue
is a property which is accessible and can be overridden in NSObject
subclasses.
For more examples and details, have a look at SE-0117.
回答2:
Read open as
open for inheritance in other modules
I repeat open for inheritance in other modules. So an open class is open for subclassing in other modules that include the defining module. Open vars and functions are open for overriding in other modules. Its the least restrictive access level. It is as good as public access accept that something that is public is closed for inheritance in other modules.
From 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.
回答3:
Open is an access level, was introduced to impose limitations on class inheritance on Swift.
This means that the open access level can only be applied to classes and class members.
In Classes
An open class can be subclassed in the module it is defined in and in modules that import the module in which the class is defined.
In Class members
The same applies to class members. An open method can be overridden by subclasses in the module it is defined in and in modules that import the module in which the method is defined.
THE NEED FOR THIS UPDATE
Some classes of libraries and frameworks are not designed to be subclassed and doing so may result in unexpected behavior. Native Apple library also won't allow overriding the same methods and classes,
So after this addition they will apply public and private access levels accordingly.
For more details have look at Apple Documentation on Access Control
回答4:
open come to play when dealing with multiple modules.
open class is accessible and subclassable outside of the defining module. An open class member is accessible and overridable outside of the defining module.
回答5:
Except for subclass, an open class func
is also accessible from anywhere in your project. Say you are defining an open class function in your Util class like this
open class Utils: NSObject {
open class func printHello() {
print("Hello from utils")
}
}
Then in anywhere of your view controllers, you can simply access this method by calling
Utils.printHello()
回答6:
open is only for another module for example: cocoa pods, or unit test, we can inherit or override
来源:https://stackoverflow.com/questions/38947101/what-is-the-open-keyword-in-swift