在Objective-C枚举中查找整数值

时间:2010-12-01 21:15:32

标签: objective-c enums

在Objective-C中是否可以查看特定int中的enum值?例如,在这个枚举中:

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

是否可以查看ValidationStatusCodes enum中是否有任意整数值?

[ValidationStatusCodes contains:intResponseCode]

或至少

[self intIsInRangeofEnum:ValidationStatusCodes forValue:intResponseCode]

5 个答案:

答案 0 :(得分:9)

没有比做

更简单的方法了
(ValidationLoginFailed == intResponseCode ||
ValidationSessionTokenExpired == intResponseCode ||
ValidationSessionTokenInvalid == intResponseCode ||
ValidationEmailNotFound == intResponseCode)

一般来说,C对于做动态事物或反映类型并不是很有帮助,而枚举是C特征。

答案 1 :(得分:3)

不是enumenum不是Objective-C对象,因此您不能像正在进行的那样发送消息。

也许使用NSDictionary?

答案 2 :(得分: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
}

答案 3 :(得分:0)

好吧,只要这个问题再次出现。有一个很好的开源项目JREnum

允许做以下事情:

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

然后ValidationStatusCodesByValue()返回NSDictionary哪些键对应NSNumber s。所以:

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

答案 4 :(得分:-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;
}

显然,最终应用程序中不仅仅有这4个代码,而且还会出现相应的错误。