在Swift中,我该如何在switch语句中编写一个case,以根据可选内容的内容测试要切换的值,如果可选包含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时,我当然会遇到运行时错误。对我来说,添加?而不是!(我想是基于可选链接的精神),但并不能使编译器错误消失(即实际上并没有打开可选的包装)。

最佳答案

可选的只是一个enum,如下所示:

enum Optional<T> : Reflectable, NilLiteralConvertible {
    case none
    case some(T)

    // ...
}
因此,您可以像平常一样将它们匹配为"Associated Values"匹配模式:
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进行匹配,请使用guard expression:
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")
}

10-01 07:42