12

从 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
};

Swift 5 switch 语句

var cardColor: CardColor = .black

switch (cardColor) {
case .black:
  print("black")
case .red:
  print("red")
}
4

1 回答 1

21

TL;博士

如果您希望 Objective-C 枚举像 Swift 枚举一样被对待,您现在需要使用不同的宏声明它们,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 编译器可以识别这一点,并且不需要开关来具有默认情况。

于 2019-03-28T15:57:22.773 回答