Синтаксис для разрешения несовместимого типа свойства в унаследованном делегате

Некоторый код, который я унаследовал, имеет раздражающее предупреждение. Он объявляет протокол, а затем использует его для указания делегата

@protocol MyTextFieldDelegate;

@interface MyTextField: UITextField
@property (nonatomic, assign) id<MyTextFieldDelegate> delegate;
@end

@protocol MyTextFieldDelegate <UITextFieldDelegate>
@optional
- (void)myTextFieldSomethingHappened:(MyTextField *)textField;
@end

Классы, которые используют myTextField реализуют MyTextFieldDelegate и вызывают его с помощью этого кода:

if ([delegate respondsToSelector:@selector(myTextFieldSomethingHappened:)])
{
    [delegate myTextFieldSomethingHappened:self];
}

Это работает, но создает (законное) предупреждение: предупреждение: тип свойства 'id' несовместим с типом 'id 'унаследовано от' UITextField '

Вот решения, которые я придумал:

  1. Удалить свойство. Это работает, но я получаю предупреждение ' - myTextFieldSomethingHappened: 'не найдено в протоколах
  2. Полностью отбросьте протокол. Никаких предупреждений, но вы также потеряете семантические предупреждения, если забудете реализовать протокол в делегате.

Есть ли способ определить свойство делегата, чтобы компилятор был доволен?

11
задан Robert Altman 18 November 2011 в 20:27
поделиться