针对 Objective-C 枚举的新 Swift 5 警告:如何摆脱它们?



从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 编译器可识别这一点,并且不要求开关具有默认大小写。

相关内容

最新更新