2009-06-10 4 views
22

컨트롤러에 끌어서 놓기 기능을 위임 할 수 있도록 NSImageView를 확장하려고합니다. 컴파일러가 유형 ID를 가진 객체에 메시지를 보내는 것에 대한 경고를 표시하는 한 가지 문제로 모두 잘 작동합니다. 이를 해결하기 위해 나는 ivar의 형식에 프로토콜의 이름을 붙이기 만하면된다고 가정했습니다. 그러나 이것은 프로토콜에 대한 정의를 찾을 수 없다는 메시지와 함께 비참하게 실패합니다.objective-C에서 프로토콜 정의 및 사용

#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에 대해서는 아주 새로운 것이다.

+0

+1 좋은 질문입니다. –

+0

키워드는 다음과 같습니다. _forward declaration_. – holex

답변

31

당신은 올바른 길을 걷고 있지만 C 컴파일러에 의해 끊어지고 있습니다. 이것은 다소 고풍입니다. 프로토콜을 사용할 때 프로토콜 정의를 사용할 수 없기 때문에 컴파일러가 질식합니다. id< DragDropImageViewDelegate>을 유형으로 사용하려면 먼저 @protocol DragDropImageViewDelegate을 정의해야합니다. 당신은 사용하기 전에 @protocol 정의를 이동 (즉, 당신의 @interface 전), 또는 @interface 전에

@protocol DragDropImageViewDelegate; 

(정방향 선언)을 추가하고있는 @protocol 선언을 남길 수 있습니다.

+0

아름다운. 고맙습니다. @implementation 위의 프로토콜 선언을 이동하면 정의되기 전에 DragDropImageView를 참조하는 프로토콜의 문제가 도입되어 실제로 앞으로 선언을해야했습니다. 도움 주셔서 감사합니다. – Tricky

+0

물론 가능합니다. 일반적으로 forward 선언은이 유형의 순환 종속성에 대한 해결책입니다. 좋은 답변에 대해서는 –

+0

+1. 나는 약간의 쿼리를 가지고 있는데, 우리가 \ @protocol DragDropImageViewDelegate를 쓸 때; \ @interface 이전에, 컴파일러는 무엇을 했는가? –

10

는 일반적으로, 나는

@class DragDropImageView; 

을 덧붙일 먼저 프로토콜을 정의하지만, 당신이 반대하고보다 앞에 수행 할 수 있습니다 내 마음에

@protocol DragDropImageViewDelegate; 

을, 프로토콜은 중요하다 선언의 일부분이며 매우 짧아지는 경향이 있으므로 헤더 파일의 맨 아래에 길을 잃지 말고 우선 취향을 선호합니다.

관련 문제