针对 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 字符串枚举?