2011-09-10 44 views
2

我有这样一段代码:目标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; 

这不完全清楚为什么你在这里返回一个操作队列,但是这是样的名字,你会使用该这样做的方法。

+1

实际上,所有对象指针都是'id'并不重要。错误发生是因为选择器,它不代表整个签名 - 特别是,它不代表类型。如果它是'float'而不是'NSString *',则会发生同样的错误。 – 2011-09-10 20:09:13

+0

好点。我专注于OP对签名的评论,而不是实际的错误消息。他的例子有相同的签名,而采用'float'会有不同的签名(尽管仍然是一个冲突的选择器)。 –

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

这是因为这两个具有相同的选择:

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

你必须选择选择唯一的名称。

1

你似乎试图重载像Java一样的方法。 Objective-C没有这种能力(它基本上不适用于Objective-C更动态的类型系统)。在Objective-C中,方法的选择器是它如何被识别的全部。把它看作是一个信息:“调用名为getSearchSuggestions:的方法并给它这些参数。”类中不能有多个方法,称为getSearchSuggestions:,因为选择器是消息调度系统唯一确定调用哪个方法的东西。