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

10-12 00:33