因此,当我输入类的名称cue
时,它会在XCode中显示为写入内容的建议,当我导入标题时,同样的事情发生(XCode建议标题)我在输入时输入)所以文件地址肯定是正确的。然而它给我一个错误,我输入的类型不存在,或者它告诉我我需要一个类型名称的方法。
类接口:
#import <Foundation/Foundation.h>
#import "CueTableCell.h"
#import "CueList.h"
typedef enum {
none,
immediate,
after,
afterWait,
} CueType;
@interface Cue : NSObject
@property CueType cueType;
@property NSString* title;
@property float wait;
@property (strong, nonatomic) Cue* nextCue;
@property CueTableCell* cell;
@property CueList* list;
-(id) initWithTitle: (NSString*) title cueType: (CueType) type list: (CueList*) list cell: (CueTableCell*) cell wait: (float) wait thenCall: (Cue*) nextCue ;
-(void) fire; //Should not be async.
-(void) reset; //Pauses and resets everything
-(void) callNext;
-(void) selected;
-(void) select;
@end
无法识别Cue.h文件的CueTableCell文件:
#import "Cue.h"
@interface CueTableCell : UITableViewCell
-(void) updateBarAt: (float) playHead;
-(void) updateBarIncrease: (float) by;
- (void)setTitle:(NSString *)title wait: (float) wait fadeOut: (float) fadeOut fadeIn: (float) fadeIn playFor: (float) playFor;
@property (nonatomic, weak) IBOutlet UILabel* titleLabel;
@property (nonatomic, weak) IBOutlet UILabel* waitLabel;
@property (nonatomic, weak) IBOutlet UILabel* fadeInLabel;
@property (nonatomic, weak) IBOutlet UILabel* fadeOutLabel;
@property (nonatomic, weak) IBOutlet UILabel* playForLabel;
@property (nonatomic, strong) NSString* title;
@property (nonatomic) float wait;
@property (nonatomic) float fadeIn;
@property (nonatomic) float fadeOut;
@property (nonatomic) float playFor;
@property (nonatomic, weak) Cue* cue; # <---- Get an error that Cue is not a type
@end
For some reason, the compiler recognizes Cue importing CueTableCell, but not the other way around. Cue is at the top of a class hierarchy, so other files clearly are able to import it. I've tried changing the group and file location of CueTableCell, and nothing helps.
答案 0 :(得分:2)
#import
只是进行文字替换。因此,在编译器尝试编译CueTableCell
时,Cue
尚未定义。
如果你只是#import "Cue.h"
,那么在定义#import "CueTableCell.h"
之前它会Cue
。如果您直接#import "CueTableCell.h"
自己,Cue
未定义任何地方。无论哪种方式,你都不能使用它;编译器不知道它应该是ObjC类型的名称。 (它可以很容易地成为各种事物 - 甚至是全局变量int。)
如果你摆脱#import
顶部的Cue.h
,而是在#import "Cue.h"
中执行CueTableCell.h
,那将解决此问题...但是立即创建一个新的,等价的,因为一旦编译器到达@property CueTableCell* cell;
,它就会抱怨CueTableCell
不是类型。
这是forward declarations的用途。只需将@class Cue;
添加到CueTableCell.h
,编译器就会知道Cue
是一个ObjC类(此时需要知道它)。
您也可以将@class CueTableCell;
添加到Cue.h
,然后删除#import "CueTableCell.h"
,CueList
也可能相同。当然.m文件可能需要包含所有标题,但这很好;他们不必相互进口,所以没有循环的危险。
您真正需要将#import "Foo.h"
放入标题文件Bar.h
的唯一原因是,任何想要使用Bar
的人还需要使用Foo
,并且不能指望知道这一点并在他的.m文件中添加#import "Foo.h"
。