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