2011-09-10 2 views
2

나는이 코드 조각이 :목표 C - 컴파일 오류 "방법의 중복 선언"

- (id) getSearchSuggestions:(NSString*)q; 
- (NSOperationQueue*) getSearchSuggestions:(NSString*)q callback:(id<UserDelegate>)callback; 
- (id) getSearchSuggestions; 
- (NSOperationQueue*) getSearchSuggestions:(id<UserDelegate>)callback; 

을 그리고 엑스 코드는 마지막 줄에 나에게 오류를 보여주는 유지 :

Duplicate declaration of method "getSearchSuggestions" 

왜? 그 서명들은 모두 다른 것처럼 보입니다. 해당 선택기의

답변

4

이 서명 :

- (id) getSearchSuggestions:(NSString*)q; 

이 서명과 동일하다 :

- (NSOperationQueue*) getSearchSuggestions:(id<UserDelegate>)callback; 

모든 객체 포인터 id이다. 그래서 이것들은 모두 객체를 가져 와서 객체를 반환하는 메소드입니다. 여기에 작업 큐를 반환 할 이유

- (id)searchSuggestionsForQueryString:(NSString*)q; // Or ForTag, or whatever "q" is 
- (NSOperationQueue*)searchOperationQueueForQuery:(NSString*)q callback:(id<UserDelegate>)callback; 
- (id)fetchSearchSuggestions; 
- (NSOperationQueue*)searchOperationQueueWithCallback:(id<UserDelegate>)callback; 

그것은 정확히 분명하지 않다, 그러나 이것은 당신이했던 방법을 위해 사용하는 거라고 이름의 종류 : 더 나은 이름의

예는 것입니다.

- (id) getSearchSuggestions:(NSString*)q; 
- (NSOperationQueue*) getSearchSuggestions:(id<UserDelegate>)callback; 

당신은 선택기에 대한 고유 한 이름을 선택해야합니다 :이 두 가지가 같은 선택을 가지고 있기 때문에

+1

실제로 모든 객체 포인터가 'id'인 것은 중요하지 않습니다. 이 오류는 선택기 (서명 전체를 나타내지 않음)로 인해 발생합니다. 특히 유형을 나타내지는 않습니다. 'NSString * '대신에'float '이라면 같은 오류가 발생합니다. –

+0

좋은 지적. 필자는 실제 오류 메시지보다는 서명에 대한 OP의 설명에 중점을 두었습니다. 그의 예는 동일한 서명을 가지고있는 반면, '부동'은 다른 선택자를가집니다 (여전히 충돌하는 선택자 임에도 불구하고). –

1

생각해 : 당신이 볼 수 있듯이

- (id) getSearchSuggestions:(NSString*)q; 
getSearchSuggestions: 

- (NSOperationQueue*) getSearchSuggestions:(NSString*)q callback:(id<UserDelegate>)callback; 
getSearchSuggestions:callback: 

- (id) getSearchSuggestions; 
getSearchSuggestions 

- (NSOperationQueue*) getSearchSuggestions:(id<UserDelegate>)callback; 
getSearchSuggestions: 

, 제 1 및 마지막 방법은 같은 선택, 따라서 중복 메소드 선언에 오류가 있습니다. 자신의 이름을 변경하여 모호성을 제거해야합니다.

1

자바와 같은 메소드를 오버로드하려고하는 것 같습니다. Objective-C에는이 기능이 없습니다 (기본적으로 Objective-C의보다 동적 인 유형 시스템에서는 제대로 작동하지 않습니다). Objective-C에서 메소드의 선택자는 그것이 어떻게 식별되는지 전체입니다. 메시지라고 생각하십시오. "getSearchSuggestions:이라는 메서드를 호출하고 이러한 인수를 지정하십시오." 셀렉터가 메시지 디스패치 시스템이 호출되는 메서드를 결정해야하는 유일한 메서드이기 때문에 클래스에 getSearchSuggestions:이라는 메서드가 여러 개있을 수 없습니다.