2011-09-10 4 views
2

私は、コードのこの部分がありますのObjective C - コンパイルエラー "方式の重複宣言"

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

をそして私はXcodeは最後行に私にエラーを示す保持:

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; 

あなたはセレクタのユニークな名前を選択する必要があります。これらの2つが同じセレクタを持っているので、

+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

Javaのようなメソッドをオーバーロードしようとしているようです。 Objective-Cにはこの機能がありません(Objective-Cのよりダイナミックなシステムでは基本的にうまく機能しません)。 Objective-Cでは、メソッドのセレクタはどのように識別されるのかが完全にわかります。それをメッセージと考えてみましょう。「getSearchSuggestions:というメソッドを呼び出して、これらの引数を付けます。 getSearchSuggestions:というクラスには複数のメソッドが存在することはできません。これは、メッセージディスパッチシステムがどのメソッドが呼び出されたかを判断するためにセレクタが唯一のものであるためです。

関連する問題