Nuevo control de enumeración Objective-C moderno

Si declaro el tipo de enumeración con la nueva macro NS_ENUM que se introdujo debido a una comprobación de tipo más fuerte, ¿puedo verificar este tipo también en time de ejecución?

Quiero decir tengo

typedef NS_ENUM(NSUInteger, MyNewType) { MyNewTypeInstance1, MyNewTypeInstance2, MyNewTypeInstance3 }; 

. Y quiero saber que, por ejemplo (NSUInteger)i = 2 es un tipo de MyNewType .

No. NS_ENUM es solo una forma de utilizar una característica introducida en Objective-C a través de C ++ 11 denominada "types subyacentes fijos" para enumeraciones. Esto garantiza que el tipo utilizado para almacenar los valores enumerados tenga un tamaño fijo y firmado, pero no le permite preguntar sobre el tipo enumerado en time de ejecución.

Si está interesado en validar si los valores son realmente miembros de su enumeración, hay dos enfoques relacionados para eso. Si los valores son contiguos, puede escribir una macro que compruebe si el valor en cuestión está en el range contiguo válido. De lo contrario, puede tomar el enfoque más general (y detallado) que toma Apple, por ejemplo, UIDeviceOrientationIsValidInterfaceOrientation , y verificar explícitamente contra todos los valores enumerados válidos.

@warrenm: buena ansewr

Estaba pensando en esto:

¿Qué hay de agregar un tipo de "myLastValueJustToCheck" y comprobar si su int es <ese valor?

 typedef NS_ENUM(NSUInteger, MyNewType) { MyNewTypeInstance1, MyNewTypeInstance2, MyNewTypeInstance3, myLastValueJustToCheck }; 

Entonces revisa:

 NSUInteger i = 2; NSLog(@"is %ii in my range? %i", i, (i<myLastValueJustToCheck)); i = 3; NSLog(@"is %ii in my range? %i", i, (i<myLastValueJustToCheck)); i = 4; NSLog(@"is %ii in my range? %i", i, (i<myLastValueJustToCheck));