मैं उद्देश्य-सी में एक ENUM को कैसे परिभाषित और उपयोग कर सकता हूं?


180

मैंने अपनी कार्यान्वयन फ़ाइल में एक एनम की घोषणा की, जैसा कि नीचे दिखाया गया है, और मेरे इंटरफ़ेस में उस प्रकार के एक वैरिएबल की घोषणा की है, जैसे कि प्लेयरस्टेप thePliveState; और मेरे तरीकों में चर का उपयोग किया। लेकिन मुझे यह बताते हुए त्रुटियां हो रही हैं कि यह अघोषित है। मैं अपने तरीकों में सही ढंग से PlayerState के एक प्रकार की घोषणा और उपयोग कैसे करूं? "

.M फ़ाइल में

@implementation View1Controller

    typedef enum playerStateTypes
        {
            PLAYER_OFF,
            PLAYER_PLAYING,
            PLAYER_PAUSED
        } PlayerState;

इन .h फ़ाइल:

@interface View1Controller : UIViewController {

    PlayerState thePlayerState;

कुछ विधि में .m फ़ाइल में:

-(void)doSomethin{

thePlayerState = PLAYER_OFF;

}

2
अब एनुम का प्रकार thePlayerState है। क्या खिलाड़ीस्टाइपटेप्स बन जाता है?
user4951

3
NS_ENUM और इसके नवीनतम आधुनिक सिंटैक्स के बारे में जानकारी के लिए, पोस्टिंग NS_ENUM & NS_OPTIONS मैट थॉम्पसन द्वारा देखें।
बेसिल बॉर्क

जवाबों:


109

आपकी typedefहेडर फ़ाइल (या कुछ अन्य फ़ाइल जो #importआपके हेडर में एड है) में होनी चाहिए , क्योंकि अन्यथा कंपाइलर को पता नहीं चलेगा कि PlayerStateआइवर किस आकार का है । इसके अलावा, यह मुझे ठीक लगता है।


इसे एक अलग फाइल में डालने का विकल्प मेरे मामले में सही लगा। मुझे नहीं पता कि यह एक अच्छा तरीका है, लेकिन मुझे दो अलग-अलग ViewControllers में एक ही एनम का उपयोग करने की आवश्यकता है (स्वयं और यह प्रतिनिधि / डेटा स्रोत है)। प्रतिनिधि / डेटा स्रोत के हेडर को आयात करने से त्रुटि हुई और एक साधारण आवश्यकता के लिए बहुत अधिक लगता है। इसलिए मैंने घोषित एनम के साथ एक नई .h फ़ाइल बनाई और इसे दोनों viewControllers.h फ़ाइल पर आयात किया। एक जादू की तरह काम किया।
लिएंड्रो एल्विस

7
NS_ENUM मैक्रो का उपयोग करने की अनुशंसा करनी चाहिए - क्योंकि यह सबसे अच्छा अभ्यास है
khebbie

1
NS_ENUMयदि आप चाहते हैं कि आपका एनम स्विफ्ट कोड में उपलब्ध हो, तो आपको ऑब्जेक्टिव-सी का उपयोग करके एनम घोषित करना चाहिए ।
स्माइबॉर्ग

@DaveDeLong, क्या यह अभी भी 2015 में मान्य है? मेरे पास फ़ाइल typedefमें घोषित किया गया .mहै और यह अच्छी तरह से संकलित और चलता है।
इयूलियन ओनोफ्रेई

यदि आप अन्य फ़ाइलों में एनम का उपयोग करने की आवश्यकता है तो @IulianOnofrei यह .h फ़ाइल में जाएगा। यदि आपको केवल एक फ़ाइल में इसकी आवश्यकता है, तो इसे .m फ़ाइल में रखना हमेशा पूरी तरह से ठीक है।
डेव डेलॉन्ग

206

Apple स्विफ्ट सहित बेहतर कोड संगतता प्रदान करने के लिए मैक्रो प्रदान करता है। मैक्रो का उपयोग इस तरह दिखता है।

typedef NS_ENUM(NSInteger, PlayerStateType) {
  PlayerStateOff,
  PlayerStatePlaying,
  PlayerStatePaused
};

यहां दस्तावेज दिया गया है


क्या Obj C Enums के सदस्य चर हो सकते हैं जैसे वे जावा में कर सकते हैं? यदि हां, तो कैसे?
घड़ीसाज़

तो दूसरा उपाय बेहतर है?
इउलियन ओनोफ्रेई

3
दूसरा समाधान बेहतर (उपयोग करना NS_ENUM) है, क्योंकि यह अधिक आधुनिक है, और अब ऑब्जेक्टिव-सी में आवश्यक है यदि आप चाहते हैं कि आपका एनम स्विफ्ट कोड में उपलब्ध हो।
स्माइबॉर्ग

दूसरा समाधान दिखाने के लिए अद्यतन वास्तव में बेहतर है।
२२:३el बजे

Apple के मानक रूप में, प्रत्येक एनुम मान के लिए टाइप नाम दोहराया जाता है।
थॉमसडब्ल्यू

29

में .h:

typedef enum {
    PlayerStateOff,
    PlayerStatePlaying,
    PlayerStatePaused
} PlayerState;

1
आप अन्य SO प्रश्नों में इस तरह का उत्तर पा सकते हैं, लेकिन जब मैं enums की समीक्षा कर रहा था, तो यह प्रश्न सबसे पहले आया, इसलिए मैंने यहाँ भी उत्तर जोड़ा।
बेन फ्लिन

19

वर्तमान परियोजनाओं के साथ आप NS_ENUM()या NS_OPTIONS()मैक्रोज़ का उपयोग करना चाह सकते हैं ।

typedef NS_ENUM(NSUInteger, PlayerState) {
        PLAYER_OFF,
        PLAYER_PLAYING,
        PLAYER_PAUSED
    };

2
... और इससे भी महत्वपूर्ण बात यह है कि, NS_ENUMयदि आप चाहते हैं कि आपके एनुम स्विफ्ट कोड में उपलब्ध हों, तो आपको उद्देश्य-सी का उपयोग करके एनमों की घोषणा करनी चाहिए ।
स्माइबॉर्ग

16

यह कैसे Apple NSString जैसी कक्षाओं के लिए करता है:

हेडर फ़ाइल में:

enum {
    PlayerStateOff,
    PlayerStatePlaying,
    PlayerStatePaused
};

typedef NSInteger PlayerState;

Http://developer.apple.com/ पर कोडिंग दिशानिर्देशों का संदर्भ लें


3
यह वास्तव में ओपी की मदद नहीं करता है। जबकि तकनीकी रूप से सही है, यह उन्हें नहीं बताता है कि पुन: प्रयोज्य
एनम

24
Developer.apple.com से लिंक करना वास्तविक मददगार नहीं है। क्या कोई अन्य जगह है जो आप के बजाय उद्धृत करना चाहते हैं?
ब्रेट

कॉपी / पेस्ट प्रलेखन जो पहले ही दे चुका है, जो लिंक मुख्य पृष्ठ है वह वास्तव में किसी अन्य लोगों की मदद नहीं कर रहा है ...
Onder OZCAN

3
यह अब पुराना हो गया है, इस पृष्ठ को देखें डेवलपर
ObjectiveC/…

8

मैं NS_OPTIONS या NS_ENUM का उपयोग करने की सलाह देता हूं। आप इसके बारे में और अधिक यहाँ पढ़ सकते हैं: http://nshipster.com/ns_enum-ns_options/

यहां NS_OPTIONS का उपयोग करके अपने स्वयं के कोड से एक उदाहरण दिया गया है, मेरी एक उपयोगिता है जो बॉर्डर बनाने के लिए एक UIView की परत पर एक सबलेयर (CALayer) सेट करती है।

ज। फ़ाइल:

typedef NS_OPTIONS(NSUInteger, BSTCMBorder) {
    BSTCMBOrderNoBorder     = 0,
    BSTCMBorderTop          = 1 << 0,
    BSTCMBorderRight        = 1 << 1,
    BSTCMBorderBottom       = 1 << 2,
    BSTCMBOrderLeft         = 1 << 3
};

@interface BSTCMBorderUtility : NSObject

+ (void)setBorderOnView:(UIView *)view
                 border:(BSTCMBorder)border
                  width:(CGFloat)width
                  color:(UIColor *)color;

@end

.M फ़ाइल:

@implementation BSTCMBorderUtility

+ (void)setBorderOnView:(UIView *)view
                 border:(BSTCMBorder)border
                  width:(CGFloat)width
                  color:(UIColor *)color
{

    // Make a left border on the view
    if (border & BSTCMBOrderLeft) {

    }

    // Make a right border on the view
    if (border & BSTCMBorderRight) {

    }

    // Etc

}

@end
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.