@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。