Objective c 目标C-“;“方法声明副本”;编译错误

Objective c 目标C-“;“方法声明副本”;编译错误,objective-c,methods,signature,Objective C,Methods,Signature,我有一段代码: - (id) getSearchSuggestions:(NSString*)q; - (NSOperationQueue*) getSearchSuggestions:(NSString*)q callback:(id<UserDelegate>)callback; - (id) getSearchSuggestions; - (NSOperationQueue*) getSearchSuggestions:(id<UserDelegate>)callb

我有一段代码:

- (id) getSearchSuggestions:(NSString*)q;
- (NSOperationQueue*) getSearchSuggestions:(NSString*)q callback:(id<UserDelegate>)callback;
- (id) getSearchSuggestions;
- (NSOperationQueue*) getSearchSuggestions:(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;
GetSearch建议:
-(NSOperationQueue*)getSearchSuggestions:(NSString*)q回调:(id)回调;
getSearchSuggestions:回调:
-(id)提出建议;
获取搜索建议
-(NSOperationQueue*)getSearchSuggestions:(id)回调;
GetSearch建议:
如您所见,第一个方法和最后一个方法具有相同的选择器,因此出现重复方法声明错误。您需要通过更改其名称来消除歧义。

此签名:

- (id) getSearchSuggestions:(NSString*)q;
- (NSOperationQueue*) getSearchSuggestions:(id<UserDelegate>)callback;
与此签名相同:

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

不清楚为什么在此处返回操作队列,但这是执行此操作的方法所使用的名称。

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

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

您必须为选择器选择唯一的名称。

您似乎试图重载Java中的方法。Objective-C没有这种能力(它基本上不适合Objective-C更动态的类型系统)。在Objective-C中,方法的选择器是识别方法的整个过程。可以将其视为一条消息:“调用名为
getSearchSuggestions:
的方法并为其提供这些参数。”在名为
getSearchSuggestions:
的类中不能有多个方法,因为选择器是消息分派系统必须确定调用哪个方法的唯一对象。

实际上,所有对象指针都是
id
,这并不重要。发生错误的原因是选择器,它不表示整个签名,特别是不表示类型。如果它是,比如说,
float
,而不是
NSString*
,同样的错误也会发生。很好。我关注OP关于签名的评论,而不是实际的错误消息。他的示例具有相同的签名,而使用
浮点
则具有不同的签名(尽管仍然是一个冲突的选择器)。