Swift用于switch语句的@unknown
Swift用于switch语句的@unknown

Swift用于switch语句的@unknown

@unknown 是 Swift 4.2 引入的一个属性,专门用于 switch 语句中的 default 或 case 分支。当枚举 (enum) 进行 switch 操作时,@unknown 主要用于处理未来可能新增的枚举值,避免遗漏未处理的情况。

基本语法

enum PaymentMethod {
    case cash
    case creditCard
    case applePay
}

func processPayment(method: PaymentMethod) {
    switch method {
    case .cash:
        print("Paid with cash")
    case .creditCard:
        print("Paid with credit card")
    @unknown default:
        print("Unknown payment method")
    }
}

@unknown default 会在 PaymentMethod 枚举中引入新 case 时触发警告或错误,提醒更新 switch 语句来处理新的情况。

如果不加 @unknown,新增枚举时,Xcode 可能不会提示更新 switch 语句。

例如,在上面的PaymentMethod枚举和switch-case语句中,PaymentMethod有三个case,而switch-case语句只有 .cash 和 .creditCard 两个case条件和default条件。

如果不使用 @unknown 修饰default,没有任何的提示。

如果使用 @unknown 修饰 default,Xcode就会提示:

Switch must be exhaustive
Add missing cases

提示内容为:“Switch 必须详尽无遗,添加缺失的案例”。

当点击修复按钮后,switch-case语句就会补录缺失的case。

为什么需要 @unknown?

未来兼容性: 如果对一个 enum 进行 switch 操作,并且未来 enum 新增了 case,没有使用 @unknown default 的话,可能会导致遗漏处理逻辑。

安全性: @unknown 提醒开发者检查和处理新的枚举值,防止意外行为。

关键区别

1、普通 default 不会在未来新增 case 时触发警告

switch method {
    case .cash, .creditCard:
        print("Handled payment")
    default:
        print("Unknown method")
}

虽然switch-case语句处理了所有情况。但如果未来 PaymentMethod 新增了 .paypal,不会触发编译器警告。

2、@unknown default 会在未来新增 case 时触发警告

switch method {
    case .cash, .creditCard:
        print("Handled payment")
    @unknown default:
        print("Unknown method, please update!")
}

如果 PaymentMethod 新增 .paypal,Xcode 会发出 警告,提醒处理新的枚举 case。

什么时候应该使用?

适用场景

处理未来可能更新的 enum,尤其是来自第三方 SDK 的 enum。

处理 Swift 标准库中不断演进的 enum。

任何 enum 可能在未来扩展的场景。

不适用场景

如果 enum 非常稳定且不太可能改变,使用普通的 default 就足够。

如果明确处理所有可能的 case,不使用 default 是更好的选择(例如 switch 中不加 default 来启用 exhaustive(详尽无遗) 检查)。

补充:不使用 default 的情况

如果 enum 处理所有情况且不想使用 default:

enum Status {
    case success
    case failure
}

func handleStatus(status: Status) {
    switch status {
    case .success:
        print("Operation succeeded.")
    case .failure:
        print("Operation failed.")
    }
}

这里不需要 default,因为 switch 已经涵盖了所有可能的 case。

注意

@unknown 只能用于 default 分支,不能用于普通 case 语句。

试图将 @unknown 应用到特定 case 会导致编译错误。

总结

@unknown 只能与 default 结合使用,用于处理未来新增的 enum case。

未来 enum 新增时,@unknown default 会触发 编译器警告,提醒更新 switch 语句。

适用于有潜在扩展的 enum 类型,尤其是来自第三方库或 API 的 enum。

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注