2010-06-26 6 views
18

मुझे आश्चर्य है कि किसी मौजूदा आइटम को मौजूदा एनम प्रकार (ढांचे का हिस्सा) में जोड़ना/जोड़ना संभव है?किसी अन्य आइटम को मौजूदा एनम प्रकार में जोड़ना संभव है?

कुछ इस तरह: हम enum प्रकार

typedef enum { 
    UIModalTransitionStyleCoverVertical = 0, 
    UIModalTransitionStyleFlipHorizontal, 
    UIModalTransitionStyleCrossDissolve, 
    UIModalTransitionStylePartialCurl, 
} UIModalTransitionStyle; 

अब मैं संलग्न या इस UIModalTransitionStyleCoverVerticalFlipped की तरह एक आइटम स्थापित करने के लिए जोड़ने के लिए चाहते हैं। क्या ऐसा कुछ पूरा हो सकता है?

+0

यदि आपके पास ढांचे का स्रोत है, तो आप यह और आपके द्वारा किए गए किसी अन्य संशोधन को कर सकते हैं। – ognian

+0

आप जो करना चाहते हैं वह सही मायने रखता है। दुर्भाग्यवश, enums वास्तव में बाहरी रूप से विस्तारित नहीं किया जा सकता है, उदाहरण के लिए, कक्षाएं (विरासत, आदि के माध्यम से) हो सकती है। – apollodude217

उत्तर

8

यह ऐसा करने के लिए, आप मूल प्रकार परिभाषा को संशोधित करने के लिए नए मूल्य शामिल करने के लिए है:

typedef enum { 
    UIModalTransitionStyleCoverVertical = 0, 
    UIModalTransitionStyleFlipHorizontal, 
    UIModalTransitionStyleCrossDissolve, 
    UIModalTransitionStylePartialCurl, 
    UIModalTransitionStyleCoverVerticalFlipped 
} UIModalTransitionStyle; 

अन्यथा, आप अपने काम नहीं कर रहा पर एक मौका ले जा सकते हैं, और यह अलग निर्धारित करें:

typedef enum { 
    UIModalTransitionStyleCoverVertical = 0, 
    UIModalTransitionStyleFlipHorizontal, 
    UIModalTransitionStyleCrossDissolve, 
    UIModalTransitionStylePartialCurl, 
} UIModalTransitionStyle; 

typedef enum { 
    UIModalTransitionStyleCoverVerticalFlipped = 
     UIModalTransitionStylePartialCurl + 1 
} ExtendedUIModalTransitionStyle; 

एक चर है कि मूल गणन पकड़ सकता है आमतौर पर भी बिल्कुल ठीक काम करेंगे जब/अगर आप रूप में अच्छी तरह से नए मूल्य निर्दिष्ट (एक विशिष्ट मामले में, यह सिर्फ एक int हो जाएगा) - लेकिन यहहै गारंटीकृत। कम से कम सिद्धांत में, कार्यान्वयन कुछ पर्याप्त बिट्स को असाइन कर सकता है ताकि यह गणना हो सके कि यह अधिक मूल्य जोड़कर इस तरह काम नहीं करेगा। यह रेंज जांच भी कर सकता है ताकि कोको रेंज वैल्यू से बाहर करने की अनुमति नहीं दी जा सके। इनमें से कोई भी सामान्य नहीं है, इसलिए व्यावहारिक दृष्टिकोण से यह शायद कोई समस्या नहीं है - लेकिन सैद्धांतिक दृष्टिकोण से, कुछ भी वास्तव में गारंटी नहीं देता है कि इस तरह का कोड काम करेगा।

+0

दो संभावित दृष्टिकोणों के लिए धन्यवाद। मैं दूसरे के साथ जाऊंगा। – user325746

+0

@ जेरी दृष्टिकोण 2 मानता है कि ऐप्पल भविष्य में एसडीके संस्करणों में UIModalTransitionStylePartialCurl के बाद एक और प्रकार (ओं) जोड़ने वाला नहीं है, जिसके बाद आपको एक संघर्ष मिलेगा। – pnizzle

+0

@pnizzle: हां, यह (भाग का) है, मैंने विशेष रूप से क्यों कहा: "आप काम नहीं कर रहे हैं ..." –

0

यह आप Enum प्रकटीकरण को अपडेट करना है ऐसा करने के लिए UIModalTransitionStyleCoverVerticalFlipped इस रूप में अच्छी तरह मूल्यों

typedef enum {  
UIModalTransitionStyleCoverVertical = 0,  
UIModalTransitionStyleFlipHorizontal,  
UIModalTransitionStyleCrossDissolve,  
UIModalTransitionStylePartialCurl,  
UIModalTransitionStyleCoverVerticalFlipped 
} UIModalTransitionStyle; 

शामिल करने के लिए इतना UIModalTransitionStyleCoverVerticalFlipped बराबर होगी लगातार 4

पूर्णांक जहाँ आप किसी भी स्ट्रिंग Enum दिसंबर से निरंतर का उपयोग । इसी निरंतर मूल्य को प्रतिस्थापित किया जाता है, इसलिए इसका उपयोग उपर्युक्त मामले में केवल निर्दिष्ट मानों के सेट (यानी 0 से 4) को रोकने के लिए किया जाता है,

14

आप नए तत्व को enum के समान प्रकार के लिए मजबूर कर सकते हैं, लेकिन आप इसे उप-वर्ग में विस्तारित नहीं कर सकते हैं। हेडर फाइल:

extern const UIModalTransitionStyle UIModalTransitionStyleCoverVerticalFlipped; 

कार्यान्वयन फ़ाइल:

const UIModalTransitionStyle UIModalTransitionStyleCoverVerticalFlipped = 10; 

मामले में कुछ जगह देने के लिए ढांचा बढ़ा दिया गया है, ताकि आप संघर्ष की जरूरत नहीं है सुनिश्चित करें। यह एक हैक का एक सा है, लेकिन यह संकलक त्रुटियों और चेतावनियों से छुटकारा पा जाएगा।

+1

प्लस 1 कुछ जगह देने के लिए सुनिश्चित करें – pnizzle

0

हो सकता है कि यह आपकी मदद कर सकते हैं:

typedef NS_ENUM(NSInteger, BaseType) { 
    BaseTypeCase1, 
    BaseTypeCase2, 
    BaseTypeSize 
}; 

typedef NS_ENUM(NSInteger, SubType) { 
    SubTypeCase1 = BaseTypeSize, 
    SubTypeCase2 
}; 

अब आप उपप्रकार जानने मूल्यों अलग हैं इस पर बदल सकते हैं।

आप BaseType के लिए पहुँच नहीं है, तो आप BaseType के अंतिम आइटम पर SubTypeCase1 सेट कर सकते हैं + 1.

नकारात्मक पहलू यह है, तो आप एक विधि है कि एक उपप्रकार लेता है की घोषणा नहीं कर सकते हैं और एक BaseType बिना यह करने के लिए पारित एक कंपाइलर चेतावनी हो रही है।इसलिए आपको चेतावनी देने के लिए एनएसआईएनटेजर्स को लेने के लिए अपनी विधियों की घोषणा करने की आवश्यकता है।

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