我有这段代码:
- (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"
为什么?
签名:
- (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;
getSearchSuggestions:
- (NSOperationQueue*) getSearchSuggestions:(NSString*)q callback:(id<UserDelegate>)callback;
getSearchSuggestions:callback:
- (id) getSearchSuggestions;
getSearchSuggestions
- (NSOperationQueue*) getSearchSuggestions:(id<UserDelegate>)callback;
getSearchSuggestions:
可以看到,第一个和最后一个方法有相同的选择器,因此出现了重复的方法声明错误。您需要通过更改它们的名称来消除它们的歧义。
这是因为它们有相同的选择器:
- (id) getSearchSuggestions:(NSString*)q;
- (NSOperationQueue*) getSearchSuggestions:(id<UserDelegate>)callback;
您似乎在尝试像Java中那样重载方法。Objective-C没有这个功能(它基本上不能很好地与Objective-C的更动态的类型系统一起工作)。在Objective-C中,方法的选择器是它如何被识别的全部。可以把它看作一条消息:"调用名为getSearchSuggestions:
的方法,并为它提供这些参数。"在名为getSearchSuggestions:
的类中不能有多个方法,因为选择器是消息调度系统确定调用哪个方法的唯一方法。