web-dev-qa-db-ja.com

新しいSwift Objective-C列挙型の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
};

Swift5のswitchステートメント

var cardColor: CardColor = .black

switch (cardColor) {
case .black:
  print("black")
case .red:
  print("red")
}
8
Clay Bridges

TL; DR

Objective-Cの列挙型をSwiftのものと同じように扱う場合は、古いNS_CLOSED_ENUMとは異なるマクロNS_ENUMを使用して宣言する必要があります。これを変更すると、警告が消えます。

ディーツ

Swift 5リリースノート から:

Swift 5モードでは、Objective-Cで宣言されている列挙型、またはシステムフレームワークからの列挙型を切り替える必要があります。これは、未知のケース(将来追加される可能性があるケース、またはObjective-C実装ファイルで非公開で定義されています。正式には、Objective-Cでは、基になる型に収まる限り、列挙型に任意の値を格納できます。これらの不明なケースは、新しい@unknownデフォルトケースを使用して処理できます。既知のケースがスイッチから省略された場合の警告。通常のデフォルトのケースを使用して処理することもできます。

Objective-Cで独自の列挙型を定義していて、不明なケースを処理するためにクライアントが必要ない場合は、NS_ENUMの代わりにNS_CLOSED_ENUMマクロを使用できます。 Swiftコンパイラはこれを認識し、スイッチにデフォルトのケースを設定する必要はありません。

13
Clay Bridges