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")
}
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コンパイラはこれを認識し、スイッチにデフォルトのケースを設定する必要はありません。