У некоторого кода, который я унаследовал, есть раздражающее предупреждение. Он объявляет протокол, а затем использует его для указания делегата
@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'
Вот решения, которые я придумала:
- Удалить имущество. Это работает, но я получаю предупреждение '- myTextFieldSomethingHappened:' не найден в протоколе (ах)
- Отбросьте протокол полностью. Предупреждений нет, но вы также теряете семантические предупреждения, если забыли реализовать протокол в делегате.
Есть ли способ определить свойство делегата таким образом, чтобы компилятор был доволен?