2010-07-03 16 views
5

मैं ऑब्जेक्टिव-सी के लिए नया हूं, लेकिन सी ++ और सीएनएसएआरएआरई में स्टोर एनम्स?

में अनुभवी मैं एक सरणी में कुछ enum स्थिरांक स्टोर करना चाहता हूं। C++ में मैं कुछ इस तरह करना होगा:

enum color {RED, BLUE, YELLOW, GREEN}; 
vector<color> supportedColors; 
supportedColors.push_back(RED); 
supportedColors.push_back(GREEN); 

लेकिन NSArray केवल दुकान वस्तु संकेत (id's)। तो उन्हें कैसे संग्रहीत किया जाना चाहिए? मैं उन्हें संभवतः पूर्णांक में डाल सकता हूं और उन्हें NSNumber ऑब्जेक्ट में संग्रहीत कर सकता हूं, लेकिन यह गन्दा लगता है।

मुझे आश्चर्य है कि अनुभवी ओबीजे-सी प्रोग्रामर क्या करते हैं?

उत्तर

13

उन्हें पूर्णांक में कास्ट करें और उन्हें NSNumbers में स्टोर करें। :)

मूल सी प्रकार कोको संग्रह कक्षाओं में वास्तव में द्वितीय श्रेणी के नागरिक हैं, और यदि आप अंतःक्रिया करना चाहते हैं तो अक्सर काम करने के लिए वर्बोज़ होते हैं। सी कहता है कि enums के अभिन्न मूल्य हैं, इसलिए इन तरीकों से इनट्स के रूप में उनका उपयोग सुरक्षित है।

आप जो भी कर रहे हैं उसके आधार पर, आप उस वास्तविक वस्तु ("माईकोलर") में उस enum को लपेटकर मैनिपुलेशन कोड को सरल बना सकते हैं, जिसमें इस पर एक संपत्ति के रूप में enum है। इन ऑब्जेक्ट्स को संग्रह कक्षाओं में वांछित के रूप में फेंक दिया जा सकता है, कुछ अपफ्रंट और रनटाइम ओवरहेड के साथ जो आप कर रहे हैं उसके आधार पर एक पर्फ स्टैंडपॉइंट से कोई फर्क नहीं पड़ता है।

+0

वहाँ कुछ मैं में एक स्विच ... मामले का उपयोग कर सकते के लिए एक अच्छी Obj सी प्रकार है और यह भी एक में डाल दिया NSArray? – joerick

+0

@joerick: 'NSNumber' का उपयोग' स्विच' कथन के साथ किया जा सकता है: 'स्विच ([myNsNumber intValue]) ... '। –

+0

बेशक। धन्यवाद दोस्तों! – joerick

0

मैं एक नया वर्ग के रूप में

vector<colorEnumClass> supportedColours

enum परिभाषित करते हैं, और उसके बाद का दृष्टांत समर्थित रंगों बनाना होगा आप तो कर सकते हैं की तरह बातें: अगर यह एक है देखने के लिए एक रंग के परीक्षण के लिए वर्ग तरीकों देना वेक्टर के सदस्य .. फिर आप रिलेशनल ऑपरेटरों का उपयोग करके स्पष्ट परीक्षण के बजाय IF कथन में उस विधि का उपयोग कर सकते हैं। स्पष्ट कोडिंग :-)

ध्यान दें कि समर्थित नाम का रंग बताता है कि यह वेक्टर एक स्थिर होना चाहिए, प्रोग्राम शुरू होने पर परिभाषित होना चाहिए और कभी नहीं बदला। यदि ऐसा है तो वेक्टर में "रंग" को कन्स्ट्रक्टर में सेट किया जाना चाहिए और कभी नहीं बदला जाना चाहिए। कक्षा को सिंगलटन के रूप में कार्यान्वित किया जाना चाहिए और आप संशोधनों को ब्लॉक करने के लिए पुशबैक() आदि के वेक्टर ऑपरेटरों को ओवरराइड भी कर सकते हैं।

यह "new" Java enumeration technology

मैं भी है कि मैं भी उद्देश्य सी के लिए नया एक वाक्य रचना सही कोड उदाहरण प्रदान करने के लिए माफी चाहता हूँ .. उल्लेख करना चाहिए की प्रकृति में है।

+2

प्रश्न सी ++ - 'वेक्टर ' में समाधानों के बारे में नहीं था, ओबीजेसी में वह क्या करना चाहता है उसका सी ++ उदाहरण है। –

0

आप शायद सभी विकल्पों के माध्यम से लूप करने का तरीका ढूंढ रहे हैं? कैसे एक पुरानी सामान्य सरणी की योजना है?

typedef enum {RED,BLUE,GREEN,YELLOW} color; 

color colors[4]={RED,YELLOW,GREEN,BLUE}; 
for (int i=0;i<4;i++) 
    colors[i]; 

दूसरी तरफ यदि प्रदर्शन कोई मुद्दा नहीं है और आप केवल कोड को साफ़ करने की तलाश में हैं; एक वर्ग ColorArray बनाने के बारे में कैसे है जो NSMutableArray encapsulates और प्रासंगिक विधियों बनाता है।

ColorArray.h:

#import <Foundation/Foundation.h> 

typedef enum {RED,BLUE,GREEN,YELLOW} Color; 

@interface ColorArray : NSObject { 
    NSMutableArray* _array; 
} 

- (id) initWithArray:(Color[])colors; 

- (void) addColor:(Color)color; 
- (Color) colorAtIndex:(int)i; 

@end 

ColorArray.c:

#import "ColorArray.h" 

@implementation ColorArray 

- (id) init { 
    if (self = [super init]) { 
     _array = [[NSMutableArray alloc] init]; 
    } 
    return self; 
} 
- (id) initWithArray:(Color[])colors { 
    if (self = [super init]) { 
     _array = [[NSMutableArray alloc] init]; 
     for (int i=0;colors[i]!=0;i++) 
      [_array addObject:[NSNumber numberWithInt:colors[i]]]; 
    } 
    return self; 
} 
- (void) dealloc { 
    [_array release]; 
    [super dealloc]; 
} 

- (void) addColor:(Color)color { 
    [_array addObject:[NSNumber numberWithInt:color]]; 
} 
- (Color) colorAtIndex:(int)i { 
    return [[_array objectAtIndex:i] intValue]; 
} 

@end 
संबंधित मुद्दे