在Swift中,我如何在switch语句中编写一个case,该语句根据optional的内容测试被切换的值,如果可选值包含nil,则跳过该case?

以下是我想象中的情况:

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
}

And for Swift > 2.0

switch someValue {
case let val where val == someOptional:
    print("matched")
default:
    print("didn't match; default")        
}

Swift相关问答推荐

启用完成并发判断以及如何解决警告(续)

try 在SwiftUI中做5星评级

文件命名&NumberForMatter+扩展名&:含义?

如何将多个完成处理程序转换为异步?

在 SwiftUI 视图中观察 UIViewRepresentable 的 @State var 变化

如何修改下面的代码,使图像 Select 的顺序与使用快速并发的图像呈现的顺序相匹配?

从 iPhone 中的安全飞地获取真正的随机数?

动画偏移正在 destruct 按钮 SwiftUI

Swift - 给定一个像 30 的 Int 如何将范围数乘以 7?

从 Swift 列表中的行中检索值

不使用 ViewController 时如何显示推送通知的alert 对话框

`@available` 属性在 macOS 版本上被错误地限制

EXC_BREAKPOINT 崩溃的原因范围

Swift 5.0 编译器无法导入使用 Swift 4.2.1 编译的模块

如何实现 Swift 的 Comparable 协议?

Swift 协议只能设置?

如何在 Swift 中将 UILabel 居中?

Type 应该采用什么协议来让泛型函数将任何数字类型作为 Swift 中的参数?

try 在解除分配时加载视图控制器的视图... UIAlertController

Swift UITableView reloadData 在一个闭包中