2010-11-04 11 views
5

मैं अपने वर्ग हैडर के शीर्ष पर एक enum परिभाषित किया है:उद्देश्य-सी enum त्रुटि?

enum PresetSeq{kSeqClear=0, kSeqAllBeats, kSeqAllTicks}; 

लेकिन जब मैं उस वर्ग enum प्रयोग करने के लिए एक प्रणाली की घोषणा करने के लिए प्रयास करें। पहले 'PresetSeq'

अगर मैं बजाय enum typedef ')' की उम्मीद:

typedef enum {kSeqClear=0, kSeqAllBeats, kSeqAllTicks} PresetSeq; 

फिर संकलक खुश है, लेकिन मुझे याद नहीं

-(void)quickSetSeq:(PresetSeq)pattern forChannel:(long)ch; 

मैं त्रुटि मिलती है सी/सी ++ में ऐसा करने के लिए।

क्या एनम्स को ओब्जे-सी में टाइपिफ़ होना चाहिए?

धन्यवाद

स्टीव

पी.एस. - मैंने Obj-C enums के बारे में अन्य पोस्ट देखी, लेकिन यह आसान मामला क्यों विफल नहीं हुआ।

उत्तर

6

ये सी enum एस हैं। (याद रखें उद्देश्य-सी सिर्फ सी का एक सख्त सुपरसेट है)।

एक प्रगणित प्रकार को परिभाषित करने के लिए, आप typedef उपयोग करना चाहिए।

हालांकि, अगर आप एक स्टैंडअलोन प्रकार (enum उपसर्ग के बिना) सामूहिक रूप से है कि enum का उल्लेख करने की आवश्यकता नहीं है, तो आप typedef की जरूरत नहीं है और आप सिर्फ इस तरह यह घोषणा कर सकते हैं:

enum PresetSeq { 
    kSeqClear, 
    kSeqAllBeats, 
    kSeqAllTicks 
}; 

typedef enum { 
    kSeqClear, 
    kSeqAllBeats, 
    kSeqAllTicks 
} PresetSeq; 

-(void)quickSetSeq:(PresetSeq)pattern forChannel:(long)ch; 

या typedef बिना और enum PresetSeq सिंटेक्स के उपयोग के रूप में ऊपर दिखाए गए:

तो, आपके मामले में, आप इसे किसी भी तरह से कर सकते हैं

-(void)quickSetSeq:(enum PresetSeq)pattern forChannel:(long)ch; 
+0

स्पष्टीकरण के लिए धन्यवाद। क्या आपको पता है कि टाइपिफ और एनम सिंटैक दोनों को छोड़कर सी ++ में कानूनी है या नहीं? मेरे पास कुछ पुराने सी ++ कोड हैं जो इसे स्वीकार करते हैं – Steve555

+0

हां, 'संरचना' और 'enum'' (या 'typedef'ing 'struct' और 'enum's' नहीं है) पूरी तरह से कानूनी C++ है। जैसा कि 'संरचना' या 'enum' लेबल जोड़ रहा है। –

+0

धन्यवाद मैक्स, जो कि पुराने कोड में जो कुछ मैं देख रहा हूं उसे बताता हूं। – Steve555

4

यदि आप का उपयोग करें:

enum PresetSeq {kSeqClear=0, kSeqAllBeats, kSeqAllTicks}; 

तो आप enum नाम का उपयोग करना चाहिए:

-(void)quickSetSeq:(enum PresetSeq)pattern forChannel:(long)ch; 

आपका प्रारंभिक त्रुटि है क्योंकि वहाँ , कोई PresetSeq प्रकार है सिर्फ एक enum PresetSeq एक।

जब आप typedef संस्करण करते हैं, तो यह एक प्रकार का उपनाम PresetSeq बनाता है जिसका आप उपयोग कर सकते हैं।

यह बिल्कुल वैसा ही है जैसा कि:

struct X {int a;}; 
typedef struct (int a;} Y; 

उस मामले में, आप struct X या Y एक प्रकार के रूप में उपयोग कर सकते हैं, लेकिन आप अपने आप ही X उपयोग नहीं कर सकते।

+0

धन्यवाद पैक्स (क्षमा करें, मेरे पास वोट करने के लिए पर्याप्त प्रतिनिधि नहीं है) – Steve555

+0

वहां जाएं, @Steve, अब आप करते हैं :-) यह महत्वपूर्ण नहीं है, क्योंकि मैंने अपनी दैनिक प्रतिनिधि टोपी मारा है। – paxdiablo

+0

धन्यवाद ............. :) – Steve555