2014-12-15 3 views
2

I my simple iOS object-c app У меня есть два файла .h, связанных друг с другом. Один из них - Delegate Protocol, другой - Interface для класса, который определяет NS_ENUM.Решите круговую зависимость

Это файл интерфейса (HistogramView.h):

#import <UIKit/UIKit.h> 
#import "DiagramViewDataSource.h" 
#import "DiagramViewDelegate.h" 

typedef NS_ENUM(NSInteger, MoveOperation) { 
    MOVE_BACKWARD, 
    MOVE_FORWARD 
}; 

@interface HistogramView : UIView 

@property (weak) id <DiagramViewDelegate> delegate; 
@property (weak) id <DiagramViewDataSource> dataSource; 

@end 

И это протокол делегат (DiagramViewDelegate.h):

#import <Foundation/Foundation.h> 
#import "HistogramView.h" 

@protocol DiagramViewDelegate <NSObject> 

-(void)diagramSectionChangedWithOperation:(MoveOperation)op; 

@end 

В делегатом, компилятор выдает мне ошибку связанный с параметром MoveOperation: «Ожидаемый тип». Я попытался также добавить @class HistogramView перед тем @protocol таким образом:

#import <Foundation/Foundation.h> 
#import "HistogramView.h" 

@class HistogramView; 

@protocol DiagramViewDelegate <NSObject> 

-(void)diagramSectionChangedWithOperation:(MoveOperation)op; 

@end 

, но ничего не меняется. Вы можете мне помочь? Заранее спасибо.

ответ

5

Три варианта:

  1. Снимите #import "DiagramViewDelegate.h" в HistogramView.h и перед @interface вперед объявить протокол, используя @protocol DiagramViewDelegate. Передние декларации предоставляются для решения округлостей, они обычно используются, когда два класса является взаимозависимым (как в @class classname;)

  2. Перемещение #import "DiagramViewDelegate.h" в HistogramView.h, чтобы после того, как typedef. Это, вероятно, кажется, немного «Hacky», но это непосредственное наблюдение, что enum необходим DiagramViewDelegate.h и приводит к ...

  3. Переместить перечисление в свой собственный заголовок и включают в себя как в DiagramViewDelegate.h и HistogramView.h. Это «чистый» способ сделать (2) - то есть упорядочить элементы заказа будут прочитаны компилятором.

НТН

+2

Вариант 4: Переместить 'enum' декларацию DiagramViewDelegate.h. Но вариант 3 лучше. – rmaddy

+0

@rmaddy - mea culpa, я пропустил этот, но потом я не сказал, что список был исчерпывающим ;-) – CRD

+1

Всегда заголовок констант - это хорошо. – uchuugaka

1

Обычно я добавляю файл Constants.h ко всем моим проектам. В вашем конкретном случае вы можете добавить свой ES_ENUM.

Затем в каждом из других файлов, которые используют ES_ENUM, добавьте #import "Constants.h".

Смежные вопросы