2013-04-30 104 views
4
typedef enum { 
    artists = 0, 
    artists_songs = 1, 
    artist_albums = 2, 
    albums = 3, 
    album_songs = 4, 
    tags = 5, 
    tag = 6, 
    tag_artists = 7, 
    tag_albums = 8, 
    tag_songs = 9, 
    songs = 10, 
    song = 11, 
    playlists = 12, 
    playlist = 13, 
    playlist_songs = 14, 
    search_songs = 15 
} Methods; 

typedef enum { 
    artists = 0, 
    albums = 1, 
    songs = 2, 
    tags = 3, 
    playlists = 4  
} ReturnTypes; 

我一直在ReturnTypes的artists = 0行發生錯誤,說藝術家已被重新聲明。我不確定這是什麼語法錯誤。有任何想法嗎?Obj-C enum重定義錯誤

+0

從任何一個枚舉定義中刪除「artists」,它表示在應用程序中重複聲明'artist'常量。 – 2013-04-30 16:11:59

回答

13

語法錯誤是artists正在重新聲明!你在第一個枚舉中聲明瞭一次,現在你試圖在第二行中再次聲明它。這些枚舉不是單獨的類型;他們只是常量列表。你不能有兩個常量,稱爲artists

這就是爲什麼可可中的枚舉具有令人厭惡的冗長名字的原因,如UITableViewCellStyleDefault。這樣他們就不會相互衝突。你應該這樣做,例如MyMethodsArtistsMyReturnTypesArtists

+1

WOW,Obj-C不區分?我不能像Methods.artists或ReturnTypes.artists? – 2013-04-30 16:21:23

+2

Objective-C是C. :( – matt 2013-04-30 16:23:36

+0

)LLVM 4.0中新增的'NS_ENUM'宏改進了一點點,允許編譯器做更像枚舉類型檢查的事情,但全局命名空間問題仍然存在。 – matt 2013-04-30 16:27:00

0

你在你的枚舉類型中都有「藝術家」。編譯器不關心它們是否具有相同的值,它會引發錯誤。

嘗試重新定義其中的一個。對於所有其他重新定義的常量,您將遇到同樣的問題。

0

enum只是整數常量的語法糖。您不能在多個地方定義給定的標識符;在這種情況下,您試圖在多個枚舉中使用相同的名稱。
你可以嘗試像靜態成員的類(粗略說明,未測試的代碼):

@implementation MethodsEnum 

+(int)artists 
{ 
    return 0; 
} 

+(int)artists_songs 
{ 
    return 1; 
} 

// etc. 

@end 

@implementation ReturnTypeEnum 

+(int)artists 
{ 
    return 0; 
} 

+(int)albums 
{ 
    return 1; 
} 

// etc. 

@end 

注意,我不建議這種方法,但它確實模仿了一些你似乎對語言功能從Java的enum中缺少。