2010-12-01 13 views
6

¿Es posible en Objective-C ver si un valor int está en un valor particular enum? Por ejemplo, en esta enumeración:Encuentre un valor entero en la enumeración Objective-C

enum { 
    ValidationLoginFailed   = 2000, 
    ValidationSessionTokenExpired = 2001, 
    ValidationSessionTokenInvalid = 2002, 
    ValidationEmailNotFound  = 2003 
}; 
typedef int ValidationStatusCodes; 

es posible ver si un valor entero arbitrario está en el ValidationStatusCodesenum?

[ValidationStatusCodes contains:intResponseCode] 

o al menos

[self intIsInRangeofEnum:ValidationStatusCodes forValue:intResponseCode] 

Respuesta

3
No

con un enum. Un enum no es un objeto Object-C, por lo que no puede enviar mensajes mientras lo hace.

¿Quizás use un NSDictionary?

9

No hay manera más sencilla que sólo haciendo

(ValidationLoginFailed == intResponseCode || 
ValidationSessionTokenExpired == intResponseCode || 
ValidationSessionTokenInvalid == intResponseCode || 
ValidationEmailNotFound == intResponseCode) 

En general, C no es muy útil para hacer las cosas dinámicos o reflexionar sobre los tipos y las enumeraciones son una característica C.

-3

[ACTUALIZACIÓN]

encontrado que este método en los puestos de algunos C++ que, aunque no totalmente dinámico, hace el truco con un mínimo esfuerzo:

Añadir extensiones de rango a enum entradas:

enum { 
    ValidationLoginFailed=2000, 
    ValidationSessionTokenExpired=2001, 
    ValidationSessionTokenInvalid=2002, 
    ValidationEmailNotFound=2003 
    ValidationSucccesMIN=ValidationLoginFailed, 
    ValidationSucccesMAX=ValidationEmailNotFound, 
    ValdationValidSuccessCode=9999, 
    ValdationInvalidCode=10000 

}; 
typedef int ValidationStatusCodes; 

a continuación, algo en estas líneas:

-(ValidationStatusCodes)isReponseCodeValid{ 

for (int i=ValidationSucccesMIN; i<=ValidationSucccesMAX; i++) { 
    if(returnCode==i){ 
     return ValdationValidSuccessCode; 
    } 
} 

return ValdationInvalidCode; 
} 

obviamente hay f Más que solo estos 4 códigos en la aplicación final, también habrá un bloque de errores correspondientes.

+2

¿Cómo se diferencian (aparte de la complejidad/rendimiento) de la simple comprobación de si "returnCode "¿está entre los valores mínimo y máximo? –

0

Bueno, siempre y cuando esta pregunta vuelva a ser válida. Hay un buen proyecto de código abierto JREnum

que permite hacer lo siguiente:

JREnumDeclare(ValidationStatusCodes, 
    ValidationLoginFailed   = 2000, 
    ValidationSessionTokenExpired = 2001, 
    ValidationSessionTokenInvalid = 2002, 
    ValidationEmailNotFound  = 2003 
); 

Y luego vuelve ValidationStatusCodesByValue()NSDictionary qué teclas son correspondientes NSNumber s. Por lo tanto:

if ([ValidationStatusCodesByValue() objectForKey:@(intResponseCode)]) 
    ... 
1

Esta pregunta es un poco anticuado, pero el estándar que he visto en el diseño de software es el uso de una máscara de bits, donde cada uno de estos valores es un estado discreto con un poco de cambio. En algunos casos, sus valores enum pueden ser combinaciones de otros valores.

enum { 
    ValidationLoginFailed   = 0, //0 
    ValidationSessionTokenExpired = 1 << 0, //1 
    ValidationSessionTokenInvalid = 1 << 1, //2 
    ValidationEmailNotFound  = 1 << 2 //4 
}; 
typedef int ValidationStatusCodes; 

Para su uso-caso de que le & su resultado con todos los elementos del conjunto:

int allStates = (ValidationLoginFailed | ValidationSessionTokenExpired | 
    ValidationSessionTokenInvalid | ValidationEmailNotFound); //7 

if(val & allStates){ 
    //some logic here 
} 
Cuestiones relacionadas