??(_:_:)
Performs a nil-coalescing operation, returning the wrapped value of an Optional instance or a default value.
Declaration
func ?? <T>(optional: consuming T?, defaultValue: @autoclosure () throws -> T) rethrows -> T where T : ~CopyableParameters
- optional:
An optional value.
- defaultValue:
A value to use as a default.
defaultValueis the same type as theWrappedtype ofoptional.
Discussion
A nil-coalescing operation unwraps the left-hand side if it has a value, or it returns the right-hand side as a default. The result of this operation will have the non-optional type of the left-hand side’s Wrapped type.
This operator uses short-circuit evaluation: optional is checked first, and defaultValue is evaluated only if optional is nil. For example:
func getDefault() -> Int {
print("Calculating default...")
return 42
}
let goodNumber = Int("100") ?? getDefault()
// goodNumber == 100
let notSoGoodNumber = Int("invalid-input") ?? getDefault()
// Prints "Calculating default..."
// notSoGoodNumber == 42In this example, goodNumber is assigned a value of 100 because Int("100") succeeded in returning a non-nil result. When notSoGoodNumber is initialized, Int("invalid-input") fails and returns nil, and so the getDefault() method is called to supply a default value.