In object-oriented programming languages, access control is a part of the apparatus of achieving encapsulation, one of four fundamentals of object-oriented programming. The goal is to establish a clear separation between interface (visible and accessible parts of the class) and implementation (internal representation and helper methods). - Wikipedia
TL;DR
In Swift 4 we have 5 access levels like Swift 3, including open
, public
, internal
, fileprivate
and private
, but has some differents.
Open
You can access open
classes and class members from any source file in the defining module or any module that imports that module. You can subclass an open
class or override an open
class member both within their defining module and any module that imports that module.
Public
public
allows the same access as open - any source file in any module - but has more restrictive subclassing and overriding. You can only subclass a public
class within the same module. A public
class member can only be overriden by subclasses in the same module. This is important if you are writing a framework.** If you want a user of that framework to be able to subclass a class or override a method you must make it** open
.
Internal
internal
allows use from any source file in the defining module but not from outside that module. This is generally the default access level.
Fileprivate
Restricts the use of an entity to its defining source file. You typically use fileprivate access to hide the implementation details of a specific piece of functionality when those details are used within an entire file.
private
Private access restricts the use of an entity to the enclosing declaration, and to extensions of that declaration that are in the same file.
Conclusion
Open access is the highest (least restrictive) access level and private access is the lowest (most restrictive) access level.
Useful link:
SE-0169