The idiom for dealing with optionals in Swift seems excessively verbose, if all you want to do is provide a default value in the case where it's nil:
if let value = optionalValue {
// do something with 'value'
} else {
// do the same thing with your default value
}
which involves needlessly duplicating code, or
var unwrappedValue
if let value = optionalValue {
unwrappedValue = value
} else {
unwrappedValue = defaultValue
}
which requires unwrappedValue
not be a constant.
Scala's Option monad (which is basically the same idea as Swift's Optional) has the method getOrElse
for this purpose:
val myValue = optionalValue.getOrElse(defaultValue)
Am I missing something? Does Swift have a compact way of doing that already? Or, failing that, is it possible to define getOrElse
in an extension for Optional?
Update
Apple has now added a coalescing operator:
var unwrappedValue = optionalValue ?? defaultValue
The ternary operator is your friend in this case
var unwrappedValue = optionalValue ? optionalValue! : defaultValue
You could also provide your own extension for the Optional enum:
extension Optional {
func or(defaultValue: T) -> T {
switch(self) {
case .None:
return defaultValue
case .Some(let value):
return value
}
}
}
Then you can just do:
optionalValue.or(defaultValue)
However, I recommend sticking to the ternary operator as other developers will understand that much more quickly without having to investigate the or
method
Note: I started a module to add common helpers like this or
on Optional
to swift.