Определение и использование протоколов в target-c - PullRequest
22 голосов
/ 10 июня 2009

Я пытаюсь расширить 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 ]

31 голосов
/ 10 июня 2009

Вы на правильном пути, но вам мешает компилятор C, который немного архаичен. Компилятор задыхается, потому что определение протокола недоступно во время его использования. @protocol DragDropImageViewDelegate должно быть определено, прежде чем вы сможете использовать id< DragDropImageViewDelegate> в качестве типа. Вы можете переместить определение @protocol перед использованием (т.е. перед вашим @interface) или добавить

@protocol DragDropImageViewDelegate;

перед @interface (предварительное объявление) и оставьте объявление @protocol там, где оно есть.

10 голосов
/ 11 июня 2009

Как правило, сначала я определяю протокол, перед которым стоит

@class DragDropImageView;

Но вы можете сделать наоборот и предвосхитить:

@protocol DragDropImageViewDelegate;

На мой взгляд, протокол является важной частью декларации и имеет тенденцию быть довольно коротким, поэтому я предпочитаю, чтобы он шел первым, а не терялся в нижней части заголовочного файла, но это вопрос вкуса.

...