0

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

1 回答 1

2

#import只是进行文本替换。因此,在编译器尝试编译CueTableCell时,Cue尚未定义。

如果你只是#import "Cue.h",它会在任何地方#import "CueTableCell.h"定义之前执行Cue。如果您直接#import "CueTableCell.h"自己,Cue则未在任何地方定义。无论哪种方式,您都无法使用它;编译器不知道它应该是 ObjC 类型的名称。(它可以很容易地是各种各样的东西——甚至是一个全局变量 int。)

#import如果你在 顶部去掉它Cue.h,而是做 a #import "Cue.h"in CueTableCell.h,那将解决这个问题......但立即创建一个新的,等效的,因为一旦编译器到达@property CueTableCell* cell;它就会抱怨它CueTableCell不是一个类型。

这就是前向声明的用途。只需添加一个@class Cue;to CueTableCell.h,编译器就会知道这Cue是一个 ObjC 类(这是它现在需要知道的全部内容)。

您也可以只添加@class CueTableCell;Cue.h,然后删除#import "CueTableCell.h"那里,也可能相同CueList。当然 .m 文件可能需要包含所有标题,但这很好;它们不必相互导入,因此没有循环的危险。

您真正需要将 a#import "Foo.h"放入头文件的唯一原因Bar.h是,如果任何想要使用的Bar人也需要使用Foo,并且不能期望知道这一点并将 a 添加#import "Foo.h"到他的 .m 文件中。

于 2013-03-29T00:59:16.393 回答