在 Swift 中,switch 和 enum 结构具有强大的模式匹配能力和严格的类型安全性,这使它们与其他语言中的大多数类似特性有所区别。
在 C 和 C++ 以及 Objective-C 中,枚举只是整数值的集合,而 switch 操作符通过匹配值进行比较。在 Swift 中,枚举(enum)功能更强大——支持关联值、计算属性和方法。switch 操作符支持模式匹配,防止不完全分支,并与范围、元组、可选值等多项内容配合使用。
在传统语言中,switch 经常导致与缺乏穷尽性(即未考虑所有情况)相关的错误、类型错误以及无法安全存储额外数据于枚举案例中的问题。这会导致在运行时而不是编译时出现错误。
在 Swift 中,如果枚举没有明确标记为 @unknown default,则 switch 需要完整处理所有情况。关联值允许优雅地在枚举案例中存储额外信息。示例:
enum NetworkResult { case success(Int) case failure(String) } func handle(result: NetworkResult) { switch result { case .success(let code): print("Success with code: \(code)") case .failure(let error): print("Failure with error: \(error)") } }
主要特点:
在使用 enum 的 switch 中是否总是需要编写 default?
不,如果所有枚举案例都被显式覆盖,则不需要 default。更重要的是,没有必要时不建议使用 default——编译器可能不会警告您添加新案例时带来的后果。
可以使用 fallthrough 在案例之间自动跳转吗?
是的,关键字 fallthrough 可用,但需谨慎使用。它不会传递关联值,这种跳转在 Swift 的实际应用中不常见。
switch number { case 1: print("one") fallthrough case 2: print("or two") default: print("other") }
如果 enum 在 Swift 中有关联值,是否可以通过 rawValue 进行比较?
不。只有没有关联值且显式指定 rawValue 的枚举可以通过 rawValue 进行初始化和比较。
开发者在对枚举 NetworkResult 的 switch 中添加了 default-case,导致在添加新案例时处理逻辑未更新,程序“静默”地出现了不正确的行为。
优点: 添加案例时没有编译器警告。
缺点: 错误在应用程序运行时显现,逻辑不会自动更新。
员工拒绝在枚举的 switch 中使用 default,允许编译器在添加新案例后发现未处理的情况。
优点: 错误在编译阶段被发现,应用程序行为变得更加可预测。
缺点: 案例数量多时需要更多的代码,但在可靠性上得到了提升。