【问题标题】:Objective C - "Duplicate declaration of method" compilation errorObjective C - “方法的重复声明”编译错误
【发布时间】:2011-09-10 20:00:19
【问题描述】:

我有这段代码:

- (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"

为什么?在我看来,签名都是不同的。

【问题讨论】:

    标签: objective-c methods signature


    【解决方案1】:

    这个签名:

    - (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并不重要。错误的发生是因为选择器,它不代表整个签名——特别是,它不代表类型。如果是 float 而不是 NSString *,也会发生同样的错误。
    • 好点。我专注于 OP 关于签名的评论,而不是实际的错误消息。他的示例具有相同的签名,而采用 float 将具有不同的签名(尽管仍然是一个冲突的选择器)。
    【解决方案2】:

    想想对应的选择器:

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

    如您所见,第一个和最后一个方法具有相同的选择器,因此重复方法声明错误。您需要通过更改它们的名称来消除它们的歧义。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        您似乎正在尝试重载 Java 中的方法。 Objective-C 没有这种能力(它基本上不能很好地与 Objective-C 更动态的类型系统一起工作)。在 Objective-C 中,方法的选择器是它被识别的全部。将其视为一条消息:“调用名为 getSearchSuggestions: 的方法并为其提供这些参数。”在名为getSearchSuggestions: 的类中不能有多个方法,因为选择器是消息调度系统唯一必须确定调用哪个方法的东西。

        【讨论】:

          猜你喜欢
          • 2012-10-15
          • 1970-01-01
          • 1970-01-01
          • 2015-04-14
          • 1970-01-01
          • 1970-01-01
          • 2012-06-16
          • 1970-01-01
          • 2015-06-10
          相关资源
          最近更新 更多