gpt4 book ai didi

iphone - 编译器无法识别类的存在,即使在导入 header 之后也是如此

转载 作者:行者123 更新时间:2023-11-28 22:36:52 25 4
gpt4 key购买 nike

因此,当我输入类名 cue 时,它会在 XCode 中显示为关于编写内容的建议,而当我导入 header 时,同样的事情会发生(XCode建议我在键入时导入的 header ),因此文件地址绝对正确。然而,它给我一个错误,指出我键入的类型不存在,或者在方法中它告诉我我需要一个类型名称。

类接口(interface):

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

如果您去掉 Cue.h 顶部的 #import,而是执行 #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 文件可能需要包含所有 header ,但这没关系;它们不必相互导入,因此不存在循环的危险。

你真正需要将 #import "Foo.h" 放入头文件 Bar.h 的唯一原因是如果有人想使用 Bar 还需要使用 Foo,不能指望知道这一点并在他的 .m 文件中添加 #import "Foo.h" .

关于iphone - 编译器无法识别类的存在,即使在导入 header 之后也是如此,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15694658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com