EnumerationSwift5.9.0
Optional
A type that represents either a wrapped value or the absence of a value.
@frozen enum Optional<Wrapped>
You use the Optional
type whenever you use optional values, even if you never type the word Optional
. Swift’s type system usually shows the wrapped type’s name with a trailing question mark (?
) instead of showing the full type name. For example, if a variable has the type Int?
, that’s just another way of writing Optional<Int>
. The shortened form is preferred for ease of reading and writing code.
The types of shortForm
and longForm
in the following code sample are the same:
let shortForm: Int? = Int("42")
let longForm: Optional<Int> = Int("42")
The Optional
type is an enumeration with two cases. Optional.none
is equivalent to the nil
literal. Optional.some(Wrapped)
stores a wrapped value. For example:
let number: Int? = Optional.some(42)
let noNumber: Int? = Optional.none
print(noNumber == nil)
// Prints "true"
You must unwrap the value of an Optional
instance before you can use it in many contexts. Because Swift provides several ways to safely unwrap optional values, you can choose the one that helps you write clear, concise code.
The following examples use this dictionary of image names and file paths:
let imagePaths = ["star": "/glyphs/star.png",
"portrait": "/images/content/portrait.jpg",
"spacer": "/images/shared/spacer.gif"]
Getting a dictionary’s value using a key returns an optional value, so imagePaths["star"]
has type Optional<String>
or, written in the preferred manner, String?
.
Optional Binding
To conditionally bind the wrapped value of an Optional
instance to a new variable, use one of the optional binding control structures, including if let
, guard let
, and switch
.
if let starPath = imagePaths["star"] {
print("The star image is at '\(starPath)'")
} else {
print("Couldn't find the star image")
}
// Prints "The star image is at '/glyphs/star.png'"
Optional Chaining
To safely access the properties and methods of a wrapped instance, use the postfix optional chaining operator (postfix ?
). The following example uses optional chaining to access the hasSuffix(_:)
method on a String?
instance.
if imagePaths["star"]?.hasSuffix(".png") == true {
print("The star image is in PNG format")
}
// Prints "The star image is in PNG format"
Using the Nil-Coalescing Operator
Use the nil-coalescing operator (??
) to supply a default value in case the Optional
instance is nil
. Here a default path is supplied for an image that is missing from imagePaths
.
let defaultImagePath = "/images/default.png"
let heartPath = imagePaths["heart"] ?? defaultImagePath
print(heartPath)
// Prints "/images/default.png"
The ??
operator also works with another Optional
instance on the right-hand side. As a result, you can chain multiple ??
operators together.
let shapePath = imagePaths["cir"] ?? imagePaths["squ"] ?? defaultImagePath
print(shapePath)
// Prints "/images/default.png"
Unconditional Unwrapping
When you’re certain that an instance of Optional
contains a value, you can unconditionally unwrap the value by using the forced unwrap operator (postfix !
). For example, the result of the failable Int
initializer is unconditionally unwrapped in the example below.
let number = Int("42")!
print(number)
// Prints "42"
You can also perform unconditional optional chaining by using the postfix !
operator.
let isPNG = imagePaths["star"]!.hasSuffix(".png")
print(isPNG)
// Prints "true"
Unconditionally unwrapping a nil
instance with !
triggers a runtime error.
Citizens in Swift
Conformances
protocol CustomDebugStringConvertible
A type with a customized textual representation suitable for debugging purposes.
protocol CustomReflectable
A type that explicitly supplies its own mirror.
protocol ExpressibleByNilLiteral
A type that can be initialized using the nil literal,
nil
.
Members
case none
The absence of a value.
case some(Wrapped)
The presence of a value, stored as
Wrapped
.init(Wrapped
) Creates an instance that stores the given value.
init(nilLiteral: ()
) Creates an instance initialized with
nil
.var customMirror: Mirror
var debugDescription: String
A textual representation of this instance, suitable for debugging.
var unsafelyUnwrapped: Wrapped
The wrapped value of this instance, unwrapped without checking whether the instance is
nil
.static func != (_OptionalNilComparisonType, Wrapped
?) -> Bool Returns a Boolean value indicating whether the right-hand-side argument is not
nil
.static func != (Wrapped
?, _OptionalNilComparisonType) -> Bool Returns a Boolean value indicating whether the left-hand-side argument is not
nil
.static func == (_OptionalNilComparisonType, Wrapped
?) -> Bool Returns a Boolean value indicating whether the right-hand-side argument is
nil
.static func == (Wrapped
?, _OptionalNilComparisonType) -> Bool Returns a Boolean value indicating whether the left-hand-side argument is
nil
.static func ~= (_OptionalNilComparisonType, Wrapped
?) -> Bool Returns a Boolean value indicating whether an argument matches
nil
.func flatMap<U>((Wrapped) throws -> U?
) rethrows -> U? Evaluates the given closure when this
Optional
instance is notnil
, passing the unwrapped value as a parameter.func map<U>((Wrapped) throws -> U
) rethrows -> U? Evaluates the given closure when this
Optional
instance is notnil
, passing the unwrapped value as a parameter.
Citizens in Swift
where Wrapped:Hashable
Conformances
protocol Hashable
A type that can be hashed into a
Hasher
to produce an integer hash value.
Members
func hash(into: inout Hasher
) Hashes the essential components of this value by feeding them into the given hasher.
Citizens in Swift
where Wrapped:Decodable
Conformances
protocol Decodable
A type that can decode itself from an external representation.
Members
init(from: Decoder
) throws Creates a new instance by decoding from the given decoder.
Citizens in Swift
where Wrapped:Equatable
Conformances
protocol Equatable
A type that can be compared for value equality.
Members
static func == (Wrapped
?, Wrapped?) -> Bool Returns a Boolean value indicating whether two optional instances are equal.
Features
Citizens in Swift
where Wrapped:Sendable
Conformances
protocol Sendable
A type whose values can safely be passed across concurrency domains by copying.
Citizens in Swift
where Wrapped:Encodable
Conformances
protocol Encodable
A type that can encode itself to an external representation.
Members
func encode(to: Encoder
) throws Encodes this optional value into the given encoder.
Available in _Differentiation
where Wrapped:Differentiable
Conformances
protocol Differentiable
A type that mathematically represents a differentiable manifold whose tangent spaces are finite-dimensional.
Members
Available in Cxx
Members
Available in Cxx
where Wrapped:UnsafeCxxInputIterator
Conformances
protocol UnsafeCxxInputIterator
Bridged C++ iterator that allows to traverse the elements of a sequence using a for-in loop.
Members
Available in Foundation
where Wrapped:EncodableWithConfiguration
Conformances
Members
Available in Foundation
where Wrapped:DecodableWithConfiguration
Conformances
Members
Extension in BSON
where Wrapped:PrimitiveEncodable
Conformances
Members
Extension in BSON
where Wrapped == Primitive
Members
Extension in Meow
where Wrapped:Resolvable
Conformances
protocol Resolvable
A protocol that provides a uniform syntax for ‘resolving’ something
Members
Extension in Atomics
where Wrapped:AtomicOptionalWrappable, Wrapped == Wrapped.AtomicRepresentation.Value
Conformances
protocol AtomicValue
A type that supports atomic operations through a separate atomic storage representation.
Members
Extension in Grammar
where Wrapped:ParsingRule
Conformances
protocol ParsingRule
A structured parsing rule.
Members
static func parse<Diagnostics>(inout ParsingInput
<Diagnostics>) -> Wrapped.Construction? typealias Location
typealias Terminal
Features
static func parse<Source, Vector>(Source, into: Vector.Type
) throws -> Vector Attempts to parse the given input completely by applying this rule repeatedly.
static func parse<Source>(diagnosing: Source
) throws -> Self.Construction Attempts to parse the given input completely, emitting diagnostics if parsing failed.
Extension in NIOCore
where Wrapped == ByteBuffer
Members
func setOrWriteBuffer(inout ByteBuffer
) -> Int If
nil
, replaceself
with.some(buffer)
. If non-nil
, writebuffer
’s readable bytes into theByteBuffer
starting atwriterIndex
.func setOrWriteImmutableBuffer(ByteBuffer
) -> Int If
nil
, replaceself
with.some(buffer)
. If non-nil
, writebuffer
’s readable bytes into theByteBuffer
starting atwriterIndex
.
Extension in SwiftSyntaxBuilder
where Wrapped:ExpressibleByLiteralSyntax
Conformances
protocol ExpressibleByLiteralSyntax
A Swift type whose value can be represented directly in source code by a Swift literal.