新手學習 Objective-C 時,編譯報錯 Expected a type,通常出現在 @interface 或屬性聲明處。
Hero.h #import "Monster.h",而 Monster.h 又 #import "Hero.h"。預處理器陷入無限遞歸,導致類型定義未完成即被引用。
在頭文件中使用 @class 前向聲明,實現文件中再 #import:
// Hero.h
#import
@class Monster; // 前向聲明
@interface Hero : NSObject
@property (nonatomic, strong) Monster *enemy;
- (void)attack;
@end
// Hero.m
#import "Hero.h"
#import "Monster.h" // 這裡才導入完整定義
@implementation Hero
- (void)attack { /* 使用 Monster 完整定義 */ }
@end
#import 而非 #include,自動防重複導入。@protocol MyDelegate; 在頭文件,#import "MyDelegate.h" 在實現文件。Swift 無頭文件,循環引用通過 weak/unowned 解決引用循環,類型循環則自動處理(模塊級可見性)。