Swift:在开关情况下testing可选值

在Swift中,如何在switch语句中编写一个case来testing与可选内容切换的值,如果可选包含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 。 添加? 而不是! 对我来说会有一定的意义(本着可select的链接,我想),但是不会使编译器错误消失(即,实际上并没有打开可选)。

可选只是一个像这样的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匹配,使用guardexpression式 :

 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") } 

从Xcode 7(从Beta 1发行说明)开始,“一个新的x? 模式可以用来模式匹配与optionals作为.Some(x)的同义词。“这意味着在Xcode 7和更高版本中, rintaro的答案的以下变化也将工作:

 switch someOptional { case someValue?: print("the value is \(someValue)") case let val?: print("the value is \(val)") default: print("nil") }