2010-12-01 42 views
6

Objective-C中可能查看int值是否在特定的enum?例如,在该枚举:在Objective-C中查找整数值枚举

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

是可以看的任意整数值是在ValidationStatusCodesenum

[ValidationStatusCodes contains:intResponseCode] 

或至少

[self intIsInRangeofEnum:ValidationStatusCodes forValue:intResponseCode] 

回答

3

不与enum。一个enum不是一个客观的C对象,所以你不能发送消息,因为你在做什么。

也许使用NSDictionary?

9

有没有不止做

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

一般简单的方式,C是不是做动态的东西或反映类型非常有益的,和枚举是C功能。

-3

[UPDATE]

发现在一些C++职位这种方法,虽然没有完全动态的,不具有最小忙乱特技:

添加范围的程度,以枚举项:

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

}; 
typedef int ValidationStatusCodes; 

那么沿着这些线:

-(ValidationStatusCodes)isReponseCodeValid{ 

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

return ValdationInvalidCode; 
} 

显然有f不仅仅是最终应用中的这4个代码,而且还会有相应的错误代码块。

+2

那如何从简单的检查,如果“RETURNCODE不同(较复杂/性能等) “介于最小值和最大值之间? – 2013-02-13 13:16:18

0

那么,只要这个问题再次提起。有一个很好的开源项目JREnum

它允许做以下事情:哪些键对应的NSNumber小号

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

然后ValidationStatusCodesByValue()返回NSDictionary。所以:

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

这个问题是有点过时,但我在软件设计中所看到的标准是使用一个位掩码,其中每个值是用位移位离散状态。在某些情况下,您的枚举值可以是其他值的组合。

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

您的使用情况,你会与组中的所有项目的&你的结果:

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

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