Определение и использование протоколов в target-c
Я пытаюсь расширить NSImageView, чтобы я мог делегировать ответственность перетаскивания для контроллера. Все это прекрасно работает с одной проблемой: компилятор теперь отображает предупреждения об отправке сообщений объектам с идентификатором типа. Чтобы решить эту проблему, я предположил, что мне просто нужно добавить суффикс типа ивара к имени протокола. Тем не менее, это терпит неудачу с сообщением, что он не может найти определение для протокола.
#import <Cocoa/Cocoa.h>
@interface DragDropImageView : NSImageView {
id <DragDropImageViewDelegate> _delegate;
}
@property (readwrite, retain) id <DragDropImageViewDelegate> delegate;
@end
@protocol DragDropImageViewDelegate
@optional
- (NSDragOperation)dragDropImageView:(DragDropImageView *)ddiv validateDrop:(id <NSDraggingInfo>)info;
- (BOOL)dragDropImageView:(DragDropImageView *)ddiv acceptDrop:(id <NSDraggingInfo>)info;
- (void)concludeDragOperation:(id <NSDraggingInfo>)sender;
@end
Любые указатели, где я могу пойти не так? Я уверен, что это должно быть что-то простое, но я совсем новичок в obj-c.
2 ответа
Вы на правильном пути, но вы зациклены на компиляторе C, который немного архаичен. Компилятор задыхается, потому что определение протокола недоступно во время его использования. @protocol DragDropImageViewDelegate
должны быть определены, прежде чем вы можете использовать id< DragDropImageViewDelegate>
как тип. Вы можете переместить определение @protocol перед использованием (то есть перед вашим @interface) или добавить
@protocol DragDropImageViewDelegate;
перед @interface (предварительное объявление) и оставьте объявление @protocol там, где оно есть.
Как правило, сначала я определяю протокол, которому предшествует
@class DragDropImageView;
Но вы можете сделать обратное и предшествовать с:
@protocol DragDropImageViewDelegate;
На мой взгляд, протокол является важной частью декларации и имеет тенденцию быть довольно коротким, поэтому я предпочитаю, чтобы он шел первым, а не терялся в нижней части заголовочного файла, но это вопрос вкуса.