2010-12-01 20 views
6

Est-il possible en Objective-C de voir si une valeur int est dans un enum particulier? Par exemple, dans ce ENUM:Trouver une valeur entière dans Objective-C enum

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

est-il possible de voir si une valeur entière arbitraire est dans le ValidationStatusCodesenum?

[ValidationStatusCodes contains:intResponseCode] 

ou au moins

[self intIsInRangeofEnum:ValidationStatusCodes forValue:intResponseCode] 

Répondre

3

Pas avec un enum. Un enum n'est pas un objet objectif-C, donc vous ne pouvez pas lui envoyer de messages comme vous le faites.

Peut-être utiliser un NSDictionary?

9

Il n'y a pas plus simple que de simplement faire

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

En général, C est pas très utile pour faire des choses dynamiques ou réfléchir sur les types et les énumérations sont une caractéristique C.

-3

[UPDATE]

trouvé cette méthode dans certains messages C + qui, bien que pas tout à fait dynamique, fait le tour avec un minimum fuss:

Ajouter degrés gamme à enum entrées:

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

}; 
typedef int ValidationStatusCodes; 

puis quelque chose le long de ces lignes:

-(ValidationStatusCodes)isReponseCodeValid{ 

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

return ValdationInvalidCode; 
} 

évidemment il y a f ar plus que ces 4 codes dans l'application finale et il y aura un bloc d'erreurs correspondantes aussi.

+2

Comment est-ce différent (autre que la complexité/performance) de vérifier simplement si « returnCode "est entre les valeurs min et max? –

0

Eh bien, tant que cette question est à nouveau en suspens. Il y a un beau projet open source JREnum

Ce qui permet de faire la chose suivante:

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

Et puis ValidationStatusCodesByValue() retours NSDictionary clés qui correspondent NSNumber s. Alors:

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

Cette question est un peu daté, mais la norme que je l'ai vu dans la conception du logiciel est d'utiliser un masque de bits où chacune de ces valeurs est un état discret avec un peu de décalage. Dans certains cas, vos valeurs enum peuvent être des combinaisons d'autres valeurs.

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

Pour votre cas d'utilisation vous & votre résultat avec tous les éléments du jeu:

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

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