A partir de Xcode 10.2, cuando uso enumeraciones que definí en Objective-C, pero en una declaración de cambio de Swift 5, recibo la siguiente advertencia, incluso si he agotado todos los valores de enumeración posibles.
Switch covers known cases, but 'MyObjectiveCEnumName' may have additional unknown valuesXcode me dice que debo arreglar esto por
Handle unknown values using "@unknown default"¿Por qué sucede esto y qué puedo hacer al respecto?
Enum Objective-C
typedef NS_ENUM(NSUInteger, CardColor) { CardColorBlack, CardColorRed };Declaración de cambio de Swift 5
var cardColor: CardColor = .black switch (cardColor) { case .black: print("black") case .red: print("red") } Si desea que las enumeraciones de Objective-C se traten como las de Swift, ahora debe declararlas usando una macro diferente, NS_CLOSED_ENUM , en comparación con la antigua NS_ENUM . Cambiar esto hará que la advertencia desaparezca.
El ejemplo anterior se convertiría
typedef NS_CLOSED_ENUM(NSUInteger, CardColor) { CardColorBlack, CardColorRed };De las notas de la versión de Swift 5 :
En el modo Swift 5, se requieren cambios en las enumeraciones que se declaran en Objective-C o que provienen de los marcos del sistema para manejar casos desconocidos, casos que podrían agregarse en el futuro o que pueden definirse de forma privada en un archivo de implementación de Objective-C. . Formalmente, Objective-C permite almacenar cualquier valor en una enumeración siempre que encaje en el tipo subyacente. Estos casos desconocidos se pueden manejar utilizando el nuevo caso predeterminado @unknown, que aún proporciona advertencias si se omite algún caso conocido del conmutador. También se pueden manejar usando un caso predeterminado normal.
Si ha definido su propia enumeración en Objective-C y no necesita clientes para manejar casos desconocidos, puede usar la macro NS_CLOSED_ENUM en lugar de NS_ENUM. El compilador de Swift reconoce esto y no requiere cambios para tener un caso predeterminado.