Verifique si existe un c objective

Tengo enumeración pnetworkingefinida para identificadores de botones:

typedef enum { button1ID = 407, button2ID = 999, button3ID = 408, button4ID = 409, } TOP_MENU_BUTTON_TYPE; 

Necesito averiguar si la ID que recibo está protegida en la enumeración. ¿Cómo puedo hacer eso? Algo como:

 if(id in TOP_MENU_BUTTON_TYPE) 

Si entiendo claramente tu pregunta, entonces esto te será útil.

En lugar de utilizar enum solo, debe intentar eso con struct y aquí es una respuesta de @Richard que lo ayudará a hacerlo.

¿Cambiar los valores de enumeración en time de ejecución?

https://stackoverflow.com/a/10305425/1083859

En el enlace anterior, explica cómo usar valores de enum dynamics con struct y también puede iterate los valores para averiguarlo. Creo que tendrás una idea.

No hay forma de repetir dinámicamente una enumeración. Los enums son una característica estática , no existen durante el time de ejecución. En time de ejecución, son simples integers (de algún tamaño) y valores.

No es posible con este requisito que declaró en generosidad:

En su respuesta, no use los valores codificados de la enumeración, solo su tipo.


Las otras respuestas muestran prácticamente todas las forms de hacerlo estáticamente .

Simplemente puede hacer esto:

 int validValue = button1ID | button2ID | button3ID | button4ID; if (validValue & id) // Valid enum value 

Una enum no es un object, es solo un número integer que el comstackdor entiende en el momento de compilation. Debido a esto, necesitará proporcionar un código de bajo nivel para hacer su cheque.

Si no está definiendo previamente los valores de sus enumeraciones, comenzarán en 0 y boostán en uno. Esto le permite comparar un valor para ver si es <= su último elemento.

testing este método:

 -(BOOL)isDefined:(TOP_MENU_BUTTON_TYPE)type{ BOOL isDefined; switch (type) { case button1ID: case button2ID: case button3ID: case button4ID: isDefined = TRUE; break; default: isDefined = FALSE; break; } return isDefined; } //(...) TOP_MENU_BUTTON_TYPE test; test = 407; NSLog(@"is %da TOP_MENU_BUTTON_TYPE? result: %d", test, [self isDefined:test]); test = 2; NSLog(@"is %da TOP_MENU_BUTTON_TYPE? result: %d", test, [self isDefined:test]); 

asi que:

 if ([self isDefined:test]){ // OK, test is defined in TOP_MENU_BUTTON_TYPE } 

en .h

 typedef enum { 407, 999, 408, 409, } TOP_MENU_BUTTON_TYPE; @interface CheckoutController : UIViewController{ TOP_MENU_BUTTON_TYPE type; } 

En .m

 switch (status) { case 407: //Your Task break; case 999: //Your Task break; case 408: //Your Task break; case 409: //Your Task break; } 

Respuestas sobre el uso de switch o bunch de || en if son correctas, pero …

Si tiene enumeración grande (enumeración con muchos valores) puede hacer esto más simple. También Cocoa usa este truco.

Sus valores de enumeración deben incrementarse en uno .
Luego agregue a enum dos valores adicionales:

 typedef enum { buttonIDMin = 407, // Lowest value button1ID = 407, button2ID = 408, // Incremented by ONE button3ID = 409, button4ID = 410, buttonIDMax = 410, // Highest value } TOP_MENU_BUTTON_TYPE; 

Cuando estás comparando, solo tienes que hacer:

 if (buttonID >= buttonIDMin && buttonID <= buttonIDMax) ...