2010-12-01 13 views
6

में एक पूर्णांक मान पाएं क्या यह उद्देश्य-सी में यह देखने के लिए संभव है कि int मान किसी विशेष enum में है या नहीं? उदाहरण के लिए, इस enum में:उद्देश्य-सी enum

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

यह अगर एक मनमाना पूर्णांक मान ValidationStatusCodesenum में है देखने के लिए संभव है?

[ValidationStatusCodes contains:intResponseCode] 

या कम से कम

[self intIsInRangeofEnum:ValidationStatusCodes forValue:intResponseCode] 

उत्तर

3
एक enum साथ

नहीं। एक enum एक उद्देश्य-सी ऑब्जेक्ट नहीं है, इसलिए आप इसे संदेश भेज नहीं सकते हैं जैसा आप कर रहे हैं।

शायद एनएस डिक्शनरी का उपयोग करें?

9

सिर्फ

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

कर सामान्य में से कोई आसान तरीका नहीं है, सी गतिशील काम करने या प्रकार को दर्शाती के लिए बहुत उपयोगी नहीं है, और enums एक सी विशेषता है।

-3

[अद्यतन]

मिले कुछ सी ++ पदों में इस विधि है, हालांकि पूरी तरह से गतिशील नहीं, कम से कम उपद्रव के साथ काम कर देता है:

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

}; 
typedef int ValidationStatusCodes; 

:

प्रविष्टियों Enum के लिए सीमा विस्तार जोड़े तो इन पंक्तियों के साथ कुछ:

-(ValidationStatusCodes)isReponseCodeValid{ 

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

return ValdationInvalidCode; 
} 

स्पष्ट रूप से एफ हैं अंतिम ऐप में केवल इन 4 कोडों से अधिक है और इसी त्रुटि वाले ब्लॉक का भी एक ब्लॉक होगा।

+2

कैसे कि बस अगर "returnCode जाँच से (जटिलता/प्रदर्शन में छोड़कर) कैसे भिन्न होता है "न्यूनतम और अधिकतम मूल्यों के बीच है? –

0

ठीक है, जब तक यह प्रश्न फिर से ऊपर है।

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

और फिर ValidationStatusCodesByValue() रिटर्न NSDictionary जो कुंजी NSNumber रों इसी की होती हैं: एक अच्छा ओपन सोर्स प्रोजेक्ट JREnum

निम्नलिखित में से कौन बात करने की अनुमति देता है। तो:

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

यह सवाल तिथि कम है, लेकिन मानक मैं सॉफ्टवेयर डिजाइन में देखा है बिटमास्क जहां इनमें से प्रत्येक मान थोड़ा-शिफ्ट के साथ एक असतत राज्य है उपयोग करने के लिए है। कुछ मामलों में, आपके enum मान अन्य मानों के संयोजन हो सकते हैं।

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 
}