假设我有一段现有的代码如下:
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 case必须是全面的,并且我将被强制处理新的缺失case。我可以在switch语句中添加第三个case,或添加默认语句。
现在,为了处理这种未预见的枚举情况,我想在上述现有函数中添加一个@unknown default
case。唯一的问题是,现在它会给我一个警告,说Default will never be executed
。
所以问题是,如何使我的枚举具有未来可扩展性,使我可以:
- 详尽地处理所有当前的enum case,和
- 拥有一个未来未知case的默认处理机制,以及
- 仅在添加新的case并且这些case必须由default case处理时才会看到警告。
这意味着以下代码不应该产生警告:
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 或其他方式实现呢?