2013-04-30 3 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의 아티스트 = 0 줄에 계속 오류가 표시됩니다. 이 구문 오류가 무엇인지 모르겠습니다. 어떤 아이디어?Obj-C 열거 형 재정의 오류

+0

'artist'를 하나의 enum 정의에서 제거하면 응용 프로그램에서 'artist'상수의 중복 선언이됩니다. –

답변

13

구문 오류는 artists이 다시 선언된다는 것입니다. 첫 번째 열거 형에서 한 번 선언 했으므로 두 번째 줄에서 다시 선언하려고합니다. 이 열거 형은 별도의 유형이 아닙니다. 그들은 상수의 목록 일뿐입니다. artists이라는 두 개의 상수를 사용할 수 없습니다.

코코아의 열거 형이 지루하고 지루한 이름 (예 : UITableViewCellStyleDefault)을 사용하는 이유입니다. 그들이 서로 충돌하지 않도록하는 것입니다. 당신도 똑같이해야합니다. MyMethodsArtistsMyReturnTypesArtists.

+1

와우, Obj-C는 차별화되지 않습니까? 나는 방법 같이 할 수 없다. 예술가 또는 ReturnTypes.artists? –

+2

Objective-C is C. : ( – matt

+0

LLVM 4.0에서 새로 추가 된'NS_ENUM' 매크로는 컴파일러가 열거 형에 대해 유형 검사와 비슷한 작업을 수행 할 수있게 해주지 만 전역 네임 스페이스 문제는 남아 있습니다. – matt

0

두 열거 형 모두에 "아티스트"가 있습니다. 컴파일러는 값이 같은지 여부에 상관없이 오류를 throw합니다.

둘 중 하나를 다시 정의 해보십시오. 다른 모든 재정의 상수에 대해서도 동일한 문제가 발생합니다.

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에서 누락되었습니다.