从Xcode 10.2开始,当使用我在Objective-C中定义的枚举时,但在Swift 5 switch语句中,我会收到以下警告,即使我已经用尽了所有可能的枚举值。
Switch covers known cases, but 'MyObjectiveCEnumName' may have additional
unknown values
Xcode 告诉我我应该通过以下方式解决这个问题
Handle unknown values using "@unknown default"
为什么会发生这种情况,我该怎么办?
例
Objective-C 枚举
typedef NS_ENUM(NSUInteger, CardColor) {
CardColorBlack,
CardColorRed
};
迅捷 5 开关语句
var cardColor: CardColor = .black
switch (cardColor) {
case .black:
print("black")
case .red:
print("red")
}
TL;博士
如果你想像对待Swift 枚举一样对待 Objective-C 枚举,你现在需要使用不同的宏NS_CLOSED_ENUM
来声明它们,而不是旧的NS_ENUM
。更改此设置将使警告消失。
上面的例子将变成
typedef NS_CLOSED_ENUM(NSUInteger, CardColor) {
CardColorBlack,
CardColorRed
};
迪茨
来自 Swift 5 发行说明:
在 Swift 5 模式下,需要切换在 Objective-C 中声明的枚举或来自系统框架的枚举来处理未知情况——将来可能会添加的情况,或者可能在 Objective-C 实现文件中私下定义的情况。从形式上讲,Objective-C允许在枚举中存储任何值,只要它适合底层类型。可以使用新的默认@unknown情况来处理这些未知情况,如果交换机中省略了任何已知情况,该情况仍会发出警告。它们也可以使用普通的默认情况进行处理。
如果你在 Objective-C 中定义了自己的枚举,并且不需要客户端来处理未知情况,则可以使用 NS_CLOSED_ENUM 宏而不是NS_ENUM。Swift 编译器可识别这一点,并且不要求开关具有默认大小写。