2010-12-01 8 views
6

Objective-Cでは、intの値が特定の値であるかどうかを確認することは可能ですenum?例えば、この列挙で:Objective-C enumで整数値を見つける

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

それは任意の整数値がValidationStatusCodesenumにあるかどうかを確認することができますか? enum

[ValidationStatusCodes contains:intResponseCode] 

または少なくとも

[self intIsInRangeofEnum:ValidationStatusCodes forValue:intResponseCode] 

答えて

3

ありません。 enumはobjective-Cオブジェクトではないため、実行中にメッセージを送信することはできません。

多分NSDictionaryを使用しますか?ただ一般的に

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

を行うよりも簡単な方法はありません

9

、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

"は最小値と最大値の間にありますか? –

0

さて、この質問が再び上がっている限り。

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

そしてValidationStatusCodesByValue()戻っNSDictionaryキーがNSNumber秒対応している次のことを行うことができます素敵なオープンソースプロジェクトJREnum

があります。だから、:

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 
} 
それは単に「RETURNCODEかどうかをチェックするから(複雑さ/パフォーマンス以外の)違いはどのように
関連する問題