In Swift, how can I write a case in a switch statement that tests the value being switched against the contents of an optional, skipping over the case if the optional contains nil?
Here's how I imagine this might look:
let someValue = 5
let someOptional: Int? = nil
switch someValue {
case someOptional:
// someOptional is non-nil, and someValue equals the unwrapped contents of someOptional
default:
// either, someOptional is nil, or someOptional is non-nil but someValue does not equal the unwrapped contents of someOptional
}
If I just write it exactly like this, the compiler complains that someOptional is not unwrapped, but if I explicitly unwrap it by adding ! to the end, I of course get a runtime error any time someOptional contains nil. Adding ? instead of ! would make some sense to me (in the spirit of optional chaining, I suppose), but doesn't make the compiler error go away (i.e. doesn't actually unwrap the optional).
Update: As of Xcode 7 (from the beta 1 release notes), “a new x? pattern can be used to pattern match against optionals as a synonym for .Some(x).” This means that in Xcode 7 and later the following variation of rintaro's answer will work as well:
switch someOptional {
case someValue?:
print("the value is \(someValue)")
case let val?:
print("the value is \(val)")
default:
print("nil")
}