在斯威夫特,我怎么能写这样的情况,一个开关语句测试值被切换对抗的内容 可选 ,跳过如果可选包含案例nil?
nil
这是我想象的样子:
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 }
如果我只是这样写,编译器会抱怨someOptional没有解包,但是如果我通过添加!到末尾来显式解包,那么我当然会在someOptional包含的任何时间收到运行时错误nil。对我来说,添加?而不是!有意义(我想是基于可选链接的精神),但并不能消除编译器错误(即,实际上并未解开可选)。
someOptional
!
?
可选enum就像这样:
enum
enum Optional<T> : Reflectable, NilLiteralConvertible { case None case Some(T) // ... }
因此,您可以像往常一样将它们与“关联值”匹配模式进行匹配:
let someValue = 5 let someOptional: Int? = nil switch someOptional { case .Some(someValue): println("the value is \(someValue)") case .Some(let val): println("the value is \(val)") default: println("nil") }
如果要从匹配someValue,请使用保护表达式:
someValue
switch someValue { case let val where val == someOptional: println(someValue) default: break }
对于Swift > 2.0
switch someValue { case let val where val == someOptional: print("matched") default: print("didn't match; default") }