Задача C - Ошибка компиляции «Дубликат декларации метода» - PullRequest
2 голосов
/ 11 сентября 2011

У меня есть этот кусок кода:

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

4 голосов
/ 11 сентября 2011

Эта подпись:

- (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 голос
/ 11 сентября 2011

Кажется, вы пытаетесь перегрузить методы, как в Java. Objective-C не имеет этой возможности (в основном он не работает с более динамичной системой типов Objective-C). В Objective-C, селектор для метода является полным, как он идентифицирован. Думайте об этом как о сообщении: «Вызовите метод с именем getSearchSuggestions: и передайте ему эти аргументы». В классе, называемом getSearchSuggestions:, не может быть нескольких методов, поскольку селектор - единственное, что система диспетчеризации сообщений должна определять, какой метод вызывается.

1 голос
/ 11 сентября 2011

это потому, что эти два имеют один и тот же селектор:

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

, вы должны выбрать уникальные имена для селекторов.

1 голос
/ 11 сентября 2011

Подумайте о соответствующих селекторах:

- (id) getSearchSuggestions:(NSString*)q;
getSearchSuggestions:

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

- (id) getSearchSuggestions;
getSearchSuggestions

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

Как видите, первый и последний метод имеют одинаковый селектор, следовательно, ошибка объявления дублированного метода. Вам нужно избавиться от них, изменив их имена.

...