问题
I read the Apple's reference about access modifiers in Swift 3. I read also about the same on stackoverflow but I didn't get an answer as the person who asked. As I understood correctly, there are four levels:
- Open, Public
- Internal
- Fileprivate
- Private
I created the schemes for myself to understand a difference between all these modifiers and uploaded here. As you can see, there are no differences between Public and Internal modifiers.. However they're on different levels. Any idea would be appreciated!
回答1:
Your diagram is just incorrect.
Public members of A.swift
and B.swift
are available to C.swift
and D.swift
. The only restriction is that classes can't be subclassed (they would need to be open
.
回答2:
Internal - This is default access specifier in swift. With this we can access data members and member functions in the same module (target).
Public - This is where you can access all data members and member functions within same module and outside of it. But you can't subclass or override outside the module.
Open - same as public, only difference is you can subclass or override outside the module.
Fileprivate - As the name say's, data members and member functions are accessible within the same file.
Private - This is where you can have access within the scope of function body or class.
回答3:
The The Swift Programming Language book from Apple clearly explains these access modifiers:
“Swift provides five different access levels for entities within your code. These access levels are relative to the source file in which an entity is defined, and also relative to the module that source file belongs to.
Open access and public access enable entities to be used within any source file from their defining module, and also in a source file from another module that imports the defining module. You typically use open or public access when specifying the public interface to a framework. The difference between open and public access is described below.
Internal access enables entities to be used within any source file from their defining module, but not in any source file outside of that module. You typically use internal access when defining an app’s or a framework’s internal structure.
File-private access restricts the use of an entity to its own defining source file. Use file-private access to hide the implementation details of a specific piece of functionality when those details are used within an entire file.
Private access restricts the use of an entity to the enclosing declaration. Use private access to hide the implementation details of a specific piece of functionality when those details are used only within a single declaration
Excerpt From: Apple Inc. “The Swift Programming Language (Swift 3.1).” iBooks. https://itun.es/gb/jEUH0.l”
回答4:
Whatever you marked as public can be used within your app and outside of your app(module). If you marked something as internal that can only be used within your app(module). This is very helpful when you're developing a library (framework), you can use internal to hide library structure.
回答5:
• Public - Can be used from any module but can’t be subclassed outside defining module (target).
• Internal - This is default access modifier in swift. Can be accessible from the defining module (target) only.
• Open - Can be used from any module and can be subclassed outside defining module (target).
• Swift 4+
• Fileprivate - Fileprivate members and functions are accessible within the same file, within the extension in same file, and extension in other file also.
• Private - Private members and functions are accessible within the same file, within the extension in same file.
回答6:
Depends on access modifier of class, function or property it can be subclassed, overrode, accessible
Access modifier can be applicable for class
, field
[About], method
. Try to access, subclass or override this.
- Access to
field
ormethod
is through aclass
- Inheritance. Successor
class
(subclass) access modifier should be the same or restrict it(exceptprivate
<->fileprivate
). Successormethod
(override) access modifier should be the same or expand it
Java access modifiers
来源:https://stackoverflow.com/questions/42897586/swift-3-the-difference-between-public-and-internal-access-modifiers