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