Как добавить метод в существующий протокол в Какао? - PullRequest
7 голосов
/ 08 января 2011

Я хочу расширить или добавить другой метод в существующий протокол.Хотя протокол, в частности, не важен, это то, что я пытаюсь сделать.

@protocol NSMatrixDelegate
- (void)myNewMethod:(id)sender;
@end

Компилятор предупреждает, что у меня есть дубликат объявления того же протокола.Как бы я сделал это правильно?

Спасибо.

1 Ответ

13 голосов
/ 08 января 2011

Вы не можете определять категории для протоколов. Есть 2 способа обойти это:

  • использовать новый формальный протокол
  • использовать неофициальный протокол и проверку во время выполнения

Формальный протокол

Определение нового формального протокола будет выглядеть так:

@protocol MyCustomMatrixDelegate <NSMatrixDelegate>

- (void) myNewMethod:(id)sender;

@end

Тогда вы бы сделали свой пользовательский класс соответствующим <MyCustomMatrixDelegate> вместо <NSMatrixDelegate>. Если вы используете этот подход, есть кое-что, о чем следует знать: [self delegate], скорее всего, будет объявлено как id<NSMatrixDelegate>. Это означает, что вы не можете сделать [[self delegate] myNewMethod:obj], потому что <NSMatrixDelegate> не объявляет метод myNewMethod:.

Способ обойти это - перепечатать delegate объект с помощью приведения. Может быть что-то вроде:

- (id<MyCustomMatrixDelegate>) customDelegate {
  return (id<MyCustomMatrixDelegate>)[self delegate];
}

(Тем не менее, вы можете сначала выполнить проверку типа, например:

if ([[self delegate] conformsToProtocol:@protocol(MyCustomMatrixDelegate)]) {
  return (id<MyCustomMatrixDelegate>)[self delegate];
}
return nil;

)

И тогда вы сделаете:

[[self customDelegate] myNewMethod:obj];

Неофициальный протокол

Это действительно необычное название для категории NSObject:

@interface NSObject (MyCustomMatrixDelegate)

- (void) myNewMethod:(id)sender;

@end

Тогда вы просто не реализуете метод. В вашем классе, который отправит метод, вы должны сделать:

if ([[self delegate] respondsToSelector:@selector(myNewMethod:)]) {
  [[self delegate] myNewMethod:someSenderValue];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...