解决循环依赖

时间:2014-12-15 23:59:19

标签: objective-c enums circular-dependency

我是简单的iOS objective-c应用程序我有两个.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参数关联的错误:&#34;预期类型&#34; 。我还尝试在@class HistogramView之前添加@protocol

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

@class HistogramView;

@protocol DiagramViewDelegate <NSObject>

-(void)diagramSectionChangedWithOperation:(MoveOperation)op;

@end 

但没有任何改变。你能帮助我吗?提前谢谢。

2 个答案:

答案 0 :(得分:5)

三个选项:

  1. 移除#import "DiagramViewDelegate.h"中的HistogramView.h,然后@interface转发使用@protocol DiagramViewDelegate声明协议。提供前向声明以解决循环问题,它们通常在两个类相互依赖时使用(如在@class classname;中)

  2. 在<{em> #import "DiagramViewDelegate.h"后移动HistogramView.h中的typedef。这可能看起来有点“hacky”,但直接观察到enum需要DiagramViewDelegate.h并导致......

  3. 将枚举移动到自己的标头中,并包含在DiagramViewDelegate.hHistogramView.h中。这是“更清洁”的方式(2) - 即安排订单项将由编译器读取。

  4. HTH

答案 1 :(得分:1)

我通常会将Constants.h文件添加到我的所有项目中。在您的特定情况下,您可以在此处添加ES_ENUM

然后在使用ES_ENUM的其他每个文件中添加#import "Constants.h"