2012-07-20 16 views
30

नवीनतम उपकरणों में, enum रों एक नई तरह की अब अनुमति दी जाती है:ऑब्जेक्टिव-सी में नए enum

typedef enum CarType : NSUInteger { 
    FourDoorCarType, 
    TwoDoorCarType 
} CarType; 

मेरा प्रश्न भागों में आता है:

  1. मैं यह क्यों इस्तेमाल करना चाहिए पुराने तरीके के बजाय?

  2. CarType क्यों दो बार दिखाई देता है? मैंने पहले CarType को छोड़ने की कोशिश की और केवल पहली पंक्ति को "typedef enum : NSUInteger {" के रूप में छोड़ दिया, और ऐसा लगता है कि यह ठीक काम करता है। क्या कोई कमी है, अगर कोई है?

  3. NSUInteger के अलावा कुछ अन्य प्रकार इस्तेमाल किए जा सकते हैं?

+6

+1 पर पोस्ट के रूप में एक ही। मैंने इस सुविधा के बारे में नहीं सुना था। –

उत्तर

19
  1. यह स्पष्ट रूप से एनम का उपयोग करने वाले संख्यात्मक प्रकार को परिभाषित करता है। यह पोर्टेबिलिटी चिंताओं के साथ मदद करता है। यह आपको मदद करता है अगर आपको हस्ताक्षरित बनाम हस्ताक्षर किए गए

  2. पर दो प्रकार वास्तव में परिभाषित किए गए हैं। पहला enum CarType है और दूसरा CarType है, जो enum CarType का उपनाम है। यदि आप चाहें तो पहले CarType को छोड़ सकते हैं। यह सिर्फ परिभाषित प्रकार होने से enum CarType को रोकता है, लेकिन CarType अभी भी मान्य है। लोगों की एक और आम बात यह है कि

    typedef enum _EnumName { 
        values 
    } EnumName; 
    

    आप यहां क्या करने का निर्णय लेते हैं व्यक्तिगत वरीयता का मामला है।

  3. हां। आप किसी भी संख्यात्मक प्रकार का उपयोग कर सकते हैं, हालांकि enum मान चुने गए प्रकार में फिट होने में सक्षम होना चाहिए।

+0

सिवाय इसके कि अंडरस्कोर से शुरू होने वाले पहचानकर्ता एक अपरकेस अक्षर के बाद कार्यान्वयन के लिए आरक्षित हैं। – dreamlax

+0

मैं अंडरस्कोर के बजाय 'टी' ('टैग' के लिए) का उपयोग करता हूं, उदाहरण: typedef enum tmyEnum {...} MyEnum; –

+0

क्या यह नई विधि फ्लोट/डबल के उपयोग की अनुमति देती है? –

3

बिंदु 2 के लिए: यह सी: typedef <something> <alias> से "वही पुराना वाक्यविन्यास" है। यहां, somethingenum <enumIdent> { <a, b, c, d, ...> } है।

आपको enumIdent और alias के लिए समान नाम का उपयोग करने की अनुमति है।

37

क्योंकि इस नए तरीके स्वतः पूर्ण, स्विच बयान, बेहतर क्रमश: अधिक सटीक चेतावनी, साथ में मदद करता है ...

स्टिक मैक्रो के साथ ...

typedef NS_ENUM(NSUInteger, CarType) { 
    FourDoorCarType, 
    TwoDoorCarType 
}; 

... पढ़ उदाहरण के लिए https://stackoverflow.com/a/3190470/581190

एनएसआईएनटेगर, ... आप किस प्रकार के लिए चाहते हैं?

+0

* यह स्वत: पूर्णता, स्विच स्टेटमेंट या चेतावनियों के साथ कैसे मदद करता है? –

+0

जब आप इस मैक्रो के साथ enum परिभाषित करते हैं, तो यह आपको चेतावनी दिखाता है कि उदाहरण के लिए स्विच स्टेटमेंट में आप सभी संभावित मामलों को संभाल नहीं सकते हैं। कल्पना करें कि आपके पास 'केस फोरडूरकार्टाइप' के साथ स्विच स्टेटमेंट है: केवल। यह आपको चेतावनी देता है कि आप 'टूडूरकार्टाइप', आदि को संभाल नहीं सकते हैं – robertvojta

1

उत्तर आपके लिए यहां होंगे।

typedef enum MYCARTYPE { // you could drop the ": NSInteger" part to you could drop the the MYCARTYPE name as well, if you like. 
    FourDoorCarType, 
    TwoDoorCarType 
} CarType; 

मुझे पुराने तरीके के बजाय इसका उपयोग क्यों करना चाहिए?

आप वर्तमान चरण में पुराने तरीके का उपयोग कर सकते हैं।

CarTypeदो बार दिखाई देता है? मैंने पहलेCarTypeको छोड़ने की कोशिश की और केवलtypedef enum : NSUInteger {, के रूप में पहली पंक्ति को छोड़कर यह ठीक काम करता प्रतीत होता है। क्या कोई कमी है, अगर कोई है?

क्योंकि आप CarType के रूप में नामित किया गया enum और फिर आप के रूप में अच्छी CarType रूप typedef परिभाषा नए प्रकार नाम दिया है। आपको enum नाम देने की आवश्यकता नहीं है क्योंकि आप कहीं भी इसका नाम उपयोग नहीं कर सकते हैं। नए प्रकार का नाम पर्याप्त होना चाहिए।

NSUIntegerके अलावा कुछ प्रकार का उपयोग किया जा सकता है?

हां, आप कर सकते हैं, प्रकार हमेशा NSInteger हैं, तो आप उन्हें unsigned integer को सीमित करने की जरूरत नहीं है।

enum CarType : NSUInteger; 

सिर्फ enum परिभाषाओं की वजह से अन्य हेडर में बड़े हेडर से बचने में मदद करता है:

+0

पहचानकर्ता जो दो अंडरस्कोर से शुरू होते हैं आरक्षित हैं और इनका उपयोग नहीं किया जाना चाहिए। इसी तरह, पहचानकर्ता जो अंडरस्कोर से शुरू होते हैं उसके बाद अपरकेस अक्षर भी आरक्षित होते हैं। – dreamlax

+0

आप आंशिक रूप से सही हैं, इस तरह के नाम ** वास्तव में ** आरक्षित हैं: '__MATH__' लेकिन अन्य आईडी के लिए, जो दो अंडरस्कोर से शुरू होता है, वहां कोई सम्मेलन नहीं होता है, इसलिए आप उन्हें '__MATH'' जैसे उपयोग कर सकते हैं। – holex

+2

नहीं, मैं पूरी तरह से सही हूं, सी मानक §7.1.3 कहता है: * सभी पहचानकर्ता जो अंडरस्कोर से शुरू होते हैं और या तो अपरकेस अक्षर या अन्य अंडरस्कोर हमेशा किसी भी उपयोग के लिए आरक्षित होते हैं। * – dreamlax

3

एक बड़ा लाभ यह है कि आप इस वाक्य रचना के साथ enums आगे-घोषणा कर सकते हैं है।

1

न्यू NS_ENUM भी आपका अनुसरण कर के रूप में घोषित अग्रेषित करने देती है:

// Forward declaration for XYZCharacterType in other header say XYZCharacter.h 
typedef NS_ENUM(NSUInteger, XYZCharacterType); 


// Enum declaration header: "XYZEnumType.h" 
#ifndef XYZCharacterType_h 
#define XYZCharacterType_h 

typedef NS_ENUM(NSUInteger, XYZEnumType) { 
    XYZCharacterTypeNotSet, 
    XYZCharacterTypeAgent, 
    XYZCharacterTypeKiller, 
}; 

#endif /* XYZCharacterType_h */` 

जवाब मैं जागरूकता बढ़ाने के लिए Forward-declare enum in Objective-C