编译器即使在导入标题后也无法识别类存在

时间:2013-03-29 00:46:25

标签: iphone ios objective-c xcode

因此,当我输入类的名称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. 

1 个答案:

答案 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"