假设我有一个现有代码,如下所示:
enum SomeEnumCases {
case existing
case alreadyExisting
}
func doSomething(withEnums enumCase: SomeEnumCases) {
switch enumCase {
case .existing:
print("This case was already existing")
case .alreadyExisting:
print("This case was already existing too...")
}
}
现在,如果我要在枚举中添加一个新案例,上面的函数会显示一个编译错误,说明 switch 案例必须是详尽的,我将被迫处理新的缺失案例。我会在 switch 语句中添加第三种情况,或者添加默认语句。
现在,我为了处理这种不可预见的枚举案例,我想@unknown default
在上面的现有函数中添加一个案例。唯一的问题是,现在它会给我一个警告说Default will never be executed
。
所以问题是,我如何对我的枚举进行未来验证,以便我可以:
- 详尽地处理所有当前的枚举案例,并且
- 对未来的未知情况有一个默认的处理机制,并且
- 仅当添加较新的案例并且这些案例必须由默认案例处理时才会看到警告。
这意味着,以下代码不应发出警告:
enum SomeEnumCases {
case existing
case alreadyExisting
}
func doSomething(withEnums enumCase: SomeEnumCases) {
switch enumCase {
case .existing:
print("This case was already existing")
case .alreadyExisting:
print("This case was already existing too...")
@unknown default: // <-- warning: Default will never be executed: should be suppressed
print("Alright, this is something new and exciting !!")
}
}
但以下代码应该给出警告:
enum SomeEnumCases {
case existing
case alreadyExisting
case new
}
func doSomething(withEnums enumCase: SomeEnumCases) {
switch enumCase { // <-- warning: Switch must be exhaustive: This should stay.
case .existing:
print("This case was already existing")
case .alreadyExisting:
print("This case was already existing too...")
@unknown default:
print("Alright, this is something new and exciting !!")
}
}
这可以通过@unknown 或其他方式实现吗?