2011-08-31 17 views
8

मेरे पास एक डिज़ाइन संबंधित प्रश्न है।स्ट्रिंग स्थिरांक बनाम enum स्थिरांक का उपयोग क्यों करें?

मैंने देखा है UIApplication वर्ग झंडे के इस प्रकार है:

UIKIT_EXTERN NSString *const UIApplicationDidEnterBackgroundNotification 
UIKIT_EXTERN NSString *const UIApplicationWillEnterForegroundNotification 
UIKIT_EXTERN NSString *const UIApplicationDidFinishLaunchingNotification; 
UIKIT_EXTERN NSString *const UIApplicationDidBecomeActiveNotification; 
UIKIT_EXTERN NSString *const UIApplicationWillResignActiveNotification; 
UIKIT_EXTERN NSString *const UIApplicationDidReceiveMemoryWarningNotification; 

और दूसरी तरफ, वर्ग UITableView तरह structs वाणी,:

typedef enum { 
    UITableViewScrollPositionNone,   
    UITableViewScrollPositionTop,  
    UITableViewScrollPositionMiddle, 
    UITableViewScrollPositionBottom 
} UITableViewScrollPosition; 

एक सूचनाओं के लिए है एक अन्य वस्तुओं के प्रकार परिभाषित करता है। मेरा मानना ​​है कि वे दोनों कुछ संबंधित वस्तुओं को 'टैग' करने के लिए डिज़ाइन विकल्प हैं और उस ध्वज के आधार पर रनटाइम पर निर्णय लेते हैं।

मान लें कि मैं उन वस्तुओं का एक कारखाना बनाना चाहता हूं जिन्हें टैग करने की आवश्यकता है। छवि में, मुझे प्रत्येक अनुभाग और विजेट के लिए गणना या आईडी चाहिए। कोई विजेट कैसे संचार करेगा या किसी अन्य को 'आह्वान' करेगा? ई.जे. [[कंटेनर साझा किया गया] वर्तमान Widget: ?? के लिए पता: ?? withInfo: (आईडी) की जानकारी];

enter image description here

वहाँ एक गहरी या अधिक सटीक कारण उनमें से एक का चयन करने के है? आपकी मदद के लिए धन्यवाद।

+0

ध्यान दें कि पहले एक तार के 'संग्रह', जहां दूसरी पूर्णांकों की एक चयन किया जाएगा हो जाएगा (शुरू करने 0 @) – KevinDTimm

+0

साथ क्या केविन ने कहा कि के साथ, मैं नहीं मानता कि आप तार का एक enum बना सकते हैं। टैग समूह के लिए Enums महान हैं। मेरी कंपनी में हम आम तौर पर सड़क के नीचे एक enum मूल्य को हटाने का फैसला करते हैं, तो हम आम तौर पर enum मूल्य निर्धारित करते हैं।राज्य को बनाए रखने वाले कुछ कोड राज्य को इंगित करने के लिए enum मान का उपयोग कर सकते हैं, हालांकि यदि आप ऐप का एक नया संस्करण लोड करते हैं और एक मान हटा दिया जाता है तो यह enum में सभी मानों को तब तक प्रभावित करेगा जब तक उन्हें स्पष्ट रूप से निर्दिष्ट नहीं किया जाता है। – Sam

+0

एक बात जो मेरे दिमाग में आती है वह यह है कि, स्ट्रिंग के साथ, आपको ऑब्जेक्ट के इंटरफ़ेस को नहीं जानना होगा जो इन स्ट्रिंग को प्राप्त करेगा। Enums के साथ, शामिल हर वस्तु रिसीवर इंटरफेस पता होगा ... क्या मैं सही हूँ? – chuckSaldana

उत्तर

8

एक enum घोषणा एक संरचना नहीं है, वाक्यविन्यास समान है लेकिन यह केवल नामित संख्याओं की एक श्रृंखला को परिभाषित करता है।

ये स्थिरांक दो अलग-अलग प्रकार के डेटा प्रकारों, स्ट्रिंग बनाम संख्यात्मक संदर्भित करते हैं।

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

NSString* const UIApplicationDidEnterBackgroundNotification = @"UIApplicationDidEnterBackgroundNotification"; 

UITableViewScrollPosition में नाम स्थिरांक पूर्णांक मूल्यों को दिया नाम हैं। की क्रमबद्ध चाहते:

const int UITableViewScrollPositionNone = 0; 

एक मामले में एक enum (नामित संख्या) का उपयोग कर के लिए कारण यह है कि वे स्ट्रिंग लगातार वे मूल्यों के कुछ ही परिभाषित बनाम सभी संभव मूल्यों को परिभाषित कर रहे है, लेकिन यह उपयोगकर्ताओं के लिए संभव है दूसरों को परिभाषित करने के लिए। स्ट्रिंग स्थिरांक के साथ अलग-अलग पुस्तकालय प्रत्येक डुप्लिकेट स्ट्रिंग पतों के किसी भी मौके के बिना स्वयं को परिभाषित कर सकते हैं, जबकि गणनाओं के लिए एक्सटेंशन को परिभाषित करने से विभिन्न पुस्तकालयों के बीच टकराव हो सकता है यदि उन्होंने एक ही पूर्णांक मान को अलग-अलग अर्थों के लिए परिभाषित किया हो।

+0

आप चारCharCodes (OSType और ऐसे) से स्विच के लिए समान तर्क दे सकते हैं: आप कुछ डेटा को "com.bigco.document" के रूप में टैग कर सकते हैं, बिना किसी चिंता के कि कोई और पहले से ही पहचानकर्ता का उपयोग कर रहा है, लेकिन चार ढूंढ रहा है मैक ओएस रोमन पात्रों ने किसी और ने दावा नहीं किया है ('' बीजीसीओ '?) बहुत कठिन है। आप अधिक वर्णों की अनुमति देने के लिए संख्या की सीमा को विस्तृत कर सकते हैं, लेकिन अभी भी एक कृत्रिम ऊपरी सीमा है जो स्ट्रिंग आइडेंटिफ़ायर का उपयोग करते समय मौजूद नहीं है। –

+0

दाएं। यदि आप एक ही पहचानकर्ता नाम के साथ दो स्ट्रिंग स्थिरांक परिभाषित करते हैं, तो आपको एक लिंकर त्रुटि मिल जाएगी, आपके पास डुप्लिकेट बाहरी पहचानकर्ता नहीं हो सकते हैं। इसी प्रकार आपके पास वास्तविक, पंजीकृत डोमेन हैं, मानते हुए डुप्लिकेट रिवर्स डोमेन नाम नहीं हो सकता है। – progrmr

0

लगता है जैसे आपको वस्तु पर एक enum संपत्ति की आवश्यकता है। तो ऑब्जेक्ट। UITableViewScrollPosition

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

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