Declaration Modifiers
Declaration modifiers are keywords or context-sensitive keywords that modify the behavior or meaning of a declaration. You specify a declaration modifier by writing the appropriate keyword or context-sensitive keyword between a declaration’s attributes (if any) and the keyword that introduces the declaration.
class
- Apply this modifier to a member of a class to indicate that the member is a member of the class itself, rather than a member of instances of the class. Members of a superclass that have this modifier and don’t have the
final
modifier can be overridden by subclasses. dynamic
-
Apply this modifier to any member of a class that can be represented by Objective-C. When you mark a member declaration with the
dynamic
modifier, access to that member is always dynamically dispatched using the Objective-C runtime. Access to that member is never inlined or devirtualized by the compiler.Because declarations marked with the
dynamic
modifier are dispatched using the Objective-C runtime, they must be marked with theobjc
attribute. final
- Apply this modifier to a class or to a property, method, or subscript member of a class. It’s applied to a class to indicate that the class can’t be subclassed. It’s applied to a property, method, or subscript of a class to indicate that a class member can’t be overridden in any subclass. For an example of how to use the
final
attribute, see Preventing Overrides. lazy
- Apply this modifier to a stored variable property of a class or structure to indicate that the property’s initial value is calculated and stored at most once, when the property is first accessed. For an example of how to use the
lazy
modifier, see Lazy Stored Properties. optional
-
Apply this modifier to a protocol’s property, method, or subscript members to indicate that a conforming type isn’t required to implement those members.
You can apply the
optional
modifier only to protocols that are marked with theobjc
attribute. As a result, only class types can adopt and conform to a protocol that contains optional member requirements. For more information about how to use theoptional
modifier and for guidance about how to access optional protocol members—for example, when you’re not sure whether a conforming type implements them—see Optional Protocol Requirements. required
- Apply this modifier to a designated or convenience initializer of a class to indicate that every subclass must implement that initializer. The subclass’s implementation of that initializer must also be marked with the
required
modifier. static
- Apply this modifier to a member of a structure, class, enumeration, or protocol to indicate that the member is a member of the type, rather than a member of instances of that type. In the scope of a class declaration, writing the
static
modifier on a member declaration has the same effect as writing theclass
andfinal
modifiers on that member declaration. However, constant type properties of a class are an exception:static
has its normal, nonclass meaning there because you can’t writeclass
orfinal
on those declarations. unowned
- Apply this modifier to a stored variable, constant, or stored property to indicate that the variable or property has an unowned reference to the object stored as its value. If you try to access the variable or property after the object has been deallocated, a runtime error is raised. Like a weak reference, the type of the property or value must be a class type; unlike a weak reference, the type is non-optional. For an example and more information about the
unowned
modifier, see Unowned References. unowned(safe)
- An explicit spelling of
unowned
. unowned(unsafe)
- Apply this modifier to a stored variable, constant, or stored property to indicate that the variable or property has an unowned reference to the object stored as its value. If you try to access the variable or property after the object has been deallocated, you’ll access the memory at the location where the object used to be, which is a memory-unsafe operation. Like a weak reference, the type of the property or value must be a class type; unlike a weak reference, the type is non-optional. For an example and more information about the
unowned
modifier, see Unowned References. weak
- Apply this modifier to a stored variable or stored variable property to indicate that the variable or property has a weak reference to the object stored as its value. The type of the variable or property must be an optional class type. If you access the variable or property after the object has been deallocated, its value is
nil
. For an example and more information about theweak
modifier, see Weak References.
Access Control Levels
Swift provides five levels of access control: open, public, internal, file private, and private. You can mark a declaration with one of the access-level modifiers below to specify the declaration’s access level. Access control is discussed in detail in Access Control.
open
- Apply this modifier to a declaration to indicate the declaration can be accessed and subclassed by code in the same module as the declaration. Declarations marked with the
open
access-level modifier can also be accessed and subclassed by code in a module that imports the module that contains that declaration. public
- Apply this modifier to a declaration to indicate the declaration can be accessed and subclassed by code in the same module as the declaration. Declarations marked with the
public
access-level modifier can also be accessed (but not subclassed) by code in a module that imports the module that contains that declaration. internal
- Apply this modifier to a declaration to indicate the declaration can be accessed only by code in the same module as the declaration. By default, most declarations are implicitly marked with the
internal
access-level modifier. fileprivate
- Apply this modifier to a declaration to indicate the declaration can be accessed only by code in the same source file as the declaration.
private
- Apply this modifier to a declaration to indicate the declaration can be accessed only by code within the declaration’s immediate enclosing scope.
For the purpose of access control, extensions to the same type that are in the same file share an access-control scope. If the type they extend is also in the same file, they share the type’s access-control scope. Private members declared in the type’s declaration can be accessed from extensions, and private members declared in one extension can be accessed from other extensions and from the type’s declaration.
Each access-level modifier above optionally accepts a single argument, which consists of the set
keyword enclosed in parentheses (for example, private(set)
). Use this form of an access-level modifier when you want to specify an access level for the setter of a variable or subscript that’s less than or equal to the access level of the variable or subscript itself, as discussed in Getters and Setters.
GRAMMAR OF A DECLARATION MODIFIER
declaration-modifier → class
| convenience
| dynamic
| final
| infix
| lazy
| optional
| override
| postfix
| prefix
| required
| static
| unowned
| unowned
(
safe
)
| unowned
(
unsafe
)
| weak
declaration-modifier → access-level-modifier
declaration-modifier → mutation-modifier
declaration-modifiers → declaration-modifier declaration-modifiers opt