2010-11-04 81 views
5

我在我的類的頭頂部定義一個枚舉:Objective-C枚舉錯誤?

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

但是,當我試圖聲明使用枚舉該類中的方法。

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

我得到的錯誤: '之前PresetSeq'

如果我的typedef代替枚舉預期 ')':

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

那麼編譯器是幸福的,但我不記得必須在C/C++中這樣做。

枚舉必須是obj-C中的typedef嗎?

感謝

史蒂夫

附: - 我看到有關Obj-C枚舉的其他文章,但不是爲什麼這個簡單的例子失敗。

回答

6

這些是C enum s。 (記住Objective-C只是C的一個嚴格的超集)。

來定義一個枚舉類型,你必須使用typedef

不過,如果你並不需要有一個獨立的(不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

感謝您的解釋。你可知道,如果忽略這兩個類型定義和枚舉syntac在C++中是合法的嗎?我似乎接受它 – Steve555 2010-11-04 06:45:53

+0

是,ommitting'struct'和'enum'(或不''typedef'ing和struct's'enum's)是完全合法的C++的一些舊的C++代碼。正如添加'struct'或'enum'標籤。 – 2010-11-04 06:59:02

+0

謝謝最大,這解釋了很多我所看到的舊代碼。 – Steve555 2010-11-04 09:57:41

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 XY作爲一種類型,但你不能對自己使用X

+0

感謝PAX(對不起,我沒有足夠的代表投了) – Steve555 2010-11-04 06:49:17

+0

有雅去,@Steve,現在你做:-)這並不重要,因爲我已經達到了我的每日限價。 – paxdiablo 2010-11-04 06:57:17

+0

謝謝............. :) – Steve555 2010-11-04 09:58:24