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

Posted

技术标签:

【中文标题】针对 Objective-C 枚举的新 Swift 5 警告:如何摆脱它们?【英文标题】:New Swift 5 warnings for Objective-C enums: how to get rid of them? 【发布时间】:2019-08-19 11:25:19 【问题描述】:

从 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")

【问题讨论】:

【参考方案1】:

TL;DR

如果您希望 Objective-C 枚举像 Swift 枚举一样被处理,您现在需要使用不同的宏声明它们,NS_CLOSED_ENUM,而不是旧的 NS_ENUM。更改此设置将使警告消失。

上面的例子会变成

typedef NS_CLOSED_ENUM(NSUInteger, CardColor) 
  CardColorBlack,
  CardColorRed
;

迪茨

来自Swift 5 release notes:

在 Swift 5 模式下,需要切换在 Objective-C 中声明的或来自系统框架的枚举来处理未知情况——可能在未来添加的情况,或者可能在 Objective-C 中私下定义的情况—— C 实现文件。形式上,Objective-C 允许在枚举中存储任何值,只要它适合基础类型。这些未知情况可以通过使用新的@unknown 默认情况来处理,如果从开关中省略任何已知情况,它仍然会提供警告。它们也可以使用正常的默认情况进行处理。

如果您在 Objective-C 中定义了自己的枚举并且不需要客户端来处理未知情况,则可以使用 NS_CLOSED_ENUM 宏而不是 NS_ENUM。 Swift 编译器可以识别这一点,并且不需要开关来具有默认情况。

【讨论】:

以上是关于针对 Objective-C 枚举的新 Swift 5 警告:如何摆脱它们?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Objective-C 中使用 Swift 字符串枚举?

仅针对 Objective-C 导出 Swift var

从 Swift 访问 Objective-C 变量/函数

从 Swift 测试文件中调用 Objective-C 类

在自定义 Swift 框架中的 Objective-C 文件上使用 Swift

Objective-C 和 Swift 混编项目的小 Tips