在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]
答案 0 :(得分:9)
没有比做
更简单的方法了(ValidationLoginFailed == intResponseCode ||
ValidationSessionTokenExpired == intResponseCode ||
ValidationSessionTokenInvalid == intResponseCode ||
ValidationEmailNotFound == intResponseCode)
一般来说,C对于做动态事物或反映类型并不是很有帮助,而枚举是C特征。
答案 1 :(得分:3)
不是enum
。 enum
不是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个代码,而且还会出现相应的错误。