【发布时间】:2023-03-19 17:54:01
【问题描述】:
注意:这不再相关。最新版本的 Swift 具有多种功能,可以通过各种方式解决枚举二进制兼容性问题,例如 @unknown default、冻结枚举等。
HealthKit 中的各种枚举往往会随着 iOS 的每个版本添加新的值。例如,HKWorkoutActivityType 自推出以来在每个 iOS 版本中都添加了新值。
假设我正在使用 Swift switch 语句将此枚举映射到字符串值:
extension HKWorkoutActivityType {
var displayName: String {
switch self {
case .americanFootball: return "American Football"
// ...Exhaustive switch statement, with a line for every enum case.
// Including values added in iOS 10 and 11...
case .taiChi: return "Tai Chi"
}
}
}
let event: HKWorkoutEvent = ...
print("Activity type is: \(event.type.displayName)")
此 switch 语句针对 iOS 11 SDK 编译,运行良好,并且向后兼容旧 iOS 版本。注意编译的时候switch语句是穷举的,所以没有default的情况。
但如果在 iOS 12 中添加了新的 HKWorkoutActivityType 值,并且我不重新编译这段代码,displayName getter 将如何处理新的枚举值?我应该期待崩溃吗?未定义的行为?它是否取决于枚举的类型(例如,这里是 Objective-C NS_ENUM,但 Swift 枚举的行为会有所不同)?等等
【问题讨论】:
-
目前讨论较多,比较github.com/apple/swift-evolution/blob/master/proposals/…(以及其中的 swift-evolution 邮件列表的链接)。
-
@MartinR 感谢您提及该提案,我已经忘记了。该提案说“如果实际遇到未知的枚举情况,Swift 4 程序将在运行时捕获”——这可能是我问题的答案。
-
请添加“未知默认”编辑作为此问题的实际答案!