objective-c - एनम - नर्सिंग कोर्स संबंधी जानकारी




उद्देश्य-सी में टाइपिफ एनम क्या है? (9)

Enum (गणना का संक्षेप) मूल्यों (अंकुशक) के एक सेट की गणना करने के लिए प्रयोग किया जाता है। एक मूल्य किसी सार तत्व (एक शब्द) द्वारा प्रतिनिधित्व की जाने वाली कोई सार वस्तु है। उदाहरण के लिए एक मूल enum हो सकता है

enum { xs,s,m,l,xl,xxl,xxxl,xxxxl };

इस enum को अनाम कहा जाता है क्योंकि आपके पास इसका नाम देने का प्रतीक नहीं है। लेकिन यह अभी भी बिल्कुल सही है। बस इसे इस तरह इस्तेमाल करें

enum { xs,s,m,l,xl,xxl,xxxl,xxxxl } myGrandMotherDressSize;

ठीक। जीवन सुंदर है और सब कुछ ठीक हो जाता है। लेकिन एक दिन आपको mygrandFatherPantSize को स्टोर करने के लिए एक नया चर परिभाषित करने के लिए इस enum का पुन: उपयोग करने की आवश्यकता है, फिर आप लिखते हैं:

enum { xs,s,m,l,xl,xxl,xxxl,xxxxl } myGrandMotherDressSize;
enum { xs,s,m,l,xl,xxl,xxxl,xxxxl } myGrandFatherPantSize;

लेकिन फिर आपके पास एक कंपाइलर त्रुटि "गणनाकर्ता का पुनर्वितरण" है। असल में समस्या यह है कि संकलक सुनिश्चित नहीं है कि आप पहले enum और आपका दूसरा एक ही बात का वर्णन करता है।

फिर यदि आप कई स्थानों पर एन्युमरेटर्स (यहां xs ... xxxxl) के एक ही सेट का पुन: उपयोग करना चाहते हैं तो आपको इसे एक अद्वितीय नाम से टैग करना होगा। दूसरी बार जब आप इस सेट का उपयोग करते हैं तो आपको बस टैग का उपयोग करना होगा। लेकिन यह न भूलें कि यह टैग enum शब्द को प्रतिस्थापित नहीं करता है बल्कि केवल अंकुशकों का सेट है। फिर सामान्य रूप से enum का उपयोग करने के लिए देखभाल करते हैं। इस कदर:

// Here the first use of my enum
enum sizes { xs,s,m,l,xl,xxl,xxxl,xxxxl } myGrandMotherDressSize; 
// here the second use of my enum. It works now !
enum sizes myGrandFatherPantSize;

आप इसे पैरामीटर परिभाषा में भी उपयोग कर सकते हैं:

// Observe that here, I still use the enum
- (void) buyANewDressToMyGrandMother:(enum sizes)theSize;

आप कह सकते हैं कि हर जगह पुनर्लेखन enum सुविधाजनक नहीं है और कोड थोड़ा अजीब लग रहा है। तुम सही हो। एक वास्तविक प्रकार बेहतर होगा।

यह शिखर सम्मेलन में हमारी महान प्रगति का अंतिम चरण है। एक टाइपपीफ जोड़कर चलिए अपने enum को वास्तविक प्रकार में बदल दें। ओह आखिरी बात, आपकी कक्षा के भीतर टाइपिफ़ की अनुमति नहीं है। फिर ऊपर अपने प्रकार को परिभाषित करें। इसको ऐसे करो:

// enum definition
enum sizes { xs,s,m,l,xl,xxl,xxxl,xxxxl };
typedef enum sizes size_type

@interface myClass {
   ...
   size_type myGrandMotherDressSize, myGrandFatherPantSize;
   ...
}

याद रखें कि टैग वैकल्पिक है। फिर यहां से उस मामले में, हम गणक को टैग नहीं करना चाहते हैं बल्कि एक नए प्रकार को परिभाषित करने के लिए। तब हमें वास्तव में इसकी आवश्यकता नहीं है।

// enum definition
typedef enum { xs,s,m,l,xl,xxl,xxxl,xxxxl } size_type;

@interface myClass : NSObject {
  ...
  size_type myGrandMotherDressSize, myGrandFatherPantSize;
  ...
}
@end

यदि आप XCode के साथ ObjectiveC में विकसित कर रहे हैं तो मैं आपको NS_ENUM के साथ prefixed कुछ अच्छे मैक्रोज़ खोजने देता हूं। इससे आपको अच्छी तरह से अच्छी तरह से परिभाषित करने में मदद मिलनी चाहिए और इसके अलावा स्थिर विश्लेषक को संकलन करने से पहले आपके लिए कुछ रोचक जांच करने में मदद मिलेगी।

अच्छा Enum!

मुझे नहीं लगता कि मैं मूल रूप से समझता हूं कि एक enum क्या है, और इसका उपयोग कब करें।

उदाहरण के लिए:

typedef enum {
    kCircle,
    kRectangle,
    kOblateSpheroid
} ShapeType;

वास्तव में यहां क्या घोषित किया जा रहा है?


Enum उपयोगकर्ता परिभाषित डेटा प्रकार है। निरंतर डेटा प्रकार अनुमानित डेटा प्रकार चर केवल उन मानों को मान सकते हैं जिन्हें पहले घोषित किया गया था।

enum month { jan = 1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec };
enum month this_month;

this_month = feb;

उपर्युक्त घोषणा में, महीने को एक गणित डेटा प्रकार के रूप में घोषित किया जाता है। इसमें मानों का एक सेट होता है, जेन टू डीक। संख्यात्मक रूप से, जन को मान 1 दिया जाता है, मान 2 को फीब किया जाता है, और इसी तरह।

परिवर्तनीय this_month को महीने के समान प्रकार के रूप में घोषित किया जाता है, फिर उसे feb से जुड़े मान को असाइन किया जाता है। इस_ माह को महीने की घोषणा के लिए प्रारंभिक सूची में निर्दिष्ट किसी भी मूल्य को असाइन नहीं किया जा सकता है।


आप निम्न प्रारूप में उपयोग कर सकते हैं, रॉ से डिफ़ॉल्ट मान 0 से शुरू हो रहा है, इसलिए

  • kCircle 0 है,
  • kRectangle 1 है,
  • कोबलेट स्फेरॉयड 2 है।

आप अपना खुद का विशिष्ट मूल्य मान असाइन कर सकते हैं।

typedef enum : NSUInteger {
    kCircle, // for your value; kCircle = 5, ...
    kRectangle,
    kOblateSpheroid
} ShapeType;

ShapeType circleShape = kCircle;
NSLog(@"%lu", (unsigned long) circleShape); // prints: 0

एक enum आदेशित मूल्यों का एक सेट घोषित करता है - typedef बस इस के लिए एक आसान नाम जोड़ता है। पहला तत्व 0 आदि है

typedef enum {
Monday=1,
...
} WORKDAYS;

WORKDAYS today = Monday;

उपरोक्त आकार टाइप प्रकार का एक गणना है।


एक टाइपिफ़ प्रोग्रामर को एक उद्देश्य-सी प्रकार को दूसरे के रूप में परिभाषित करने की अनुमति देता है। उदाहरण के लिए,

typedef int काउंटर; इंट प्रकार के बराबर होने के लिए काउंटर प्रकार को परिभाषित करता है। यह कोड पठनीयता में काफी सुधार करता है।


एक्सकोड 4.4 के बाद से ऐप्पल इस तरह की परिभाषाओं को परिभाषित करने की सिफारिश करता है:

typedef enum ShapeType : NSUInteger {
    kCircle,
    kRectangle,
    kOblateSpheroid
} ShapeType;

वे एक आसान मैक्रो NS_ENUM भी प्रदान करते हैं:

typedef NS_ENUM(NSUInteger, ShapeType) {
    kCircle,
    kRectangle,
    kOblateSpheroid
};

ये परिभाषाएं मजबूत प्रकार की जांच और बेहतर कोड पूर्णता प्रदान करती हैं। मुझे NS_ENUM का आधिकारिक दस्तावेज़ीकरण नहीं मिला, लेकिन आप here डब्ल्यूडब्ल्यूडीसी 2012 सत्र से "आधुनिक उद्देश्य-सी" वीडियो देख सकते here

अद्यतन: here आधिकारिक दस्तावेज से लिंक here


यहां तीन चीजें घोषित की जा रही हैं: अज्ञात ShapeType प्रकार घोषित किया गया है, ShapeType गणना के लिए आकार टाइप को टाइप किया गया है, और तीन नाम kCircle , kRectangle , और kOblateSpheroid को अभिन्न स्थिरांक घोषित किया जा रहा है।

चलो इसे तोड़ दें। सबसे सरल मामले में, एक गणना के रूप में घोषित किया जा सकता है

enum tagname { ... };

यह टैग tagname साथ एक गणना की घोषणा करता है। सी और उद्देश्य-सी (लेकिन सी ++ नहीं ) में, इसके किसी भी संदर्भ enum कीवर्ड से पहले होना चाहिए। उदाहरण के लिए:

enum tagname x;  // declare x of type 'enum tagname'
tagname x;  // ERROR in C/Objective-C, OK in C++

हर जगह enum कीवर्ड का उपयोग करने से बचने के लिए, एक टाइपिफ़ बनाया जा सकता है:

enum tagname { ... };
typedef enum tagname tagname;  // declare 'tagname' as a typedef for 'enum tagname'

इसे एक पंक्ति में सरलीकृत किया जा सकता है:

typedef enum tagname { ... } tagname;  // declare both 'enum tagname' and 'tagname'

और अंत में, अगर हमें enum कीवर्ड के साथ enum tagname का उपयोग करने में सक्षम होने की आवश्यकता नहीं है, तो हम enum अनाम बना सकते हैं और केवल इसे टाइप किए गए नाम के साथ घोषित कर सकते हैं:

typedef enum { ... } tagname;

अब, इस मामले में, हम ShapeType को एक अज्ञात गणना के टाइप किए गए नाम के रूप में घोषित कर रहे हैं। ShapeType टाइप वास्तव में केवल एक अभिन्न प्रकार है, और केवल उन चरों को घोषित करने के लिए उपयोग किया जाना चाहिए जो घोषणा में सूचीबद्ध मूल्यों में से एक है ( kCircle , kRectangle , kRectangle , और kOblateSpheroid )। आप कास्टिंग करके एक ShapeType वैरिएबल को अन्य मान असाइन कर सकते हैं, हालांकि, आपको enum मानों को पढ़ने के दौरान सावधान रहना होगा।

अंत में, kCircle , kRectangle , और kOblateSpheroid को वैश्विक नामस्थान में अभिन्न स्थिरांक के रूप में घोषित किया जाता है। चूंकि कोई विशिष्ट मान निर्दिष्ट नहीं किया गया था, इसलिए kCircle 0 से शुरू होने वाले लगातार पूर्णांक को आवंटित किया जाता है, इसलिए kCircle 0 है, kRectangle 1 है, और kOblateSpheroid 2 है।


typedef मौजूदा चर प्रकार के नाम को फिर से परिभाषित करने के लिए उपयोगी है। यह डेटाटाइप को कॉल करने के लिए संक्षिप्त और सार्थक तरीका प्रदान करता है। उदाहरण के लिए:

typedef unsigned long int TWOWORDS;

यहां, टाइप किए गए लंबे int int प्रकार को TWOWORDS प्रकार के रूप में परिभाषित किया गया है। इस प्रकार, अब हम लिखने के द्वारा हस्ताक्षरित लंबे int प्रकार के चर घोषित कर सकते हैं,

TWOWORDS var1, var2;

के बजाय

unsigned long int var1, var2;

typedef enum {
kCircle,
kRectangle,
kOblateSpheroid
} ShapeType;

तो आप इसका उपयोग कर सकते हैं: -

 ShapeType shape;

तथा

 enum {
    kCircle,
    kRectangle,
    kOblateSpheroid
} 
ShapeType;

अब आप इसका उपयोग कर सकते हैं: -

enum ShapeType shape;




typedef