一尘不染

Swift:在切换情况下针对可选值进行测试

swift

在斯威夫特,我怎么能写这样的情况,一个开关语句测试值被切换对抗的内容 可选 ,跳过如果可选包含案例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。对我来说,添加?而不是!有意义(我想是基于可选链接的精神),但并不能消除编译器错误(即,实际上并未解开可选)。


阅读 199

收藏
2020-07-07

共1个答案

一尘不染

可选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,请使用保护表达式

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