2010-12-01 41 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 
}