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テキストの置換を行うだけです。そのため、コンパイラがコンパイルを試みた時点ではCueTableCellCueはまだ定義されていません。

だけの場合#import "Cue.h"、どこでも#import "CueTableCell.h"定義する前に実行します。自分自身Cueを直接する場合は、どこにも定義されていません。いずれにせよ、それを使用することはできません。コンパイラは、それが ObjC 型の名前であることを認識していません。(グローバル変数の int でさえ、あらゆる種類のものである可能性があります。)#import "CueTableCell.h"Cue

#importの先頭にあるそれを取り除き、Cue.h代わりに#import "Cue.h"inを実行するとCueTableCell.h、この問題は解決しますが、すぐに新しい同等の問題を作成します。@property CueTableCell* cell;CueTableCell

これが前方宣言の目的です。@class Cue;に aを追加するだけCueTableCell.hで、コンパイラはそれCueが ObjC クラスであることを認識します (この時点で知る必要があるのはこれだけです)。

おそらく、そこに追加@class CueTableCell;してそこCue.hを削除することもできます。おそらく同様です。もちろん、.m ファイルにはおそらくすべてのヘッダーを含める必要がありますが、それで問題ありません。相互にインポートする必要がないため、循環の危険はありません。#import "CueTableCell.h"CueList

#import "Foo.h"本当にa をヘッダー ファイルに入れる必要がある唯一の理由Bar.hは、使用したい人Barが も使用する必要があり、それを知り、自分の .m ファイルFooに a を追加することを期待できない場合です。#import "Foo.h"

于 2013-03-29T00:59:16.393 に答える