因此,当我输入类的名称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.
最佳答案
#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
,并且不能期望知道并添加一个。 #import "Foo.h"
放入他的.m文件。
关于iphone - 即使导入 header ,编译器也无法识别类的存在,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15694658/