指向方法的返回types的“预期types”错误

我试图编译,但每次我做,一个方法抛出一个奇怪的“预期types”的错误。 我在头上有一个方法:

-(ANObject *)generateSomethingForSomethingElse:(NSString *)somethingElse; 

这个方法的返回types的错误点。 我已经使用#import "ANObject.h" ANObject导入ANObjectANObject编译罚款..

为什么发生这种情况?

这与编译源文件的顺序有关。您可能已经知道,在定义之前,您不能调用方法(请参阅下面的伪代码):

 var value = someMethod(); function someMethod() { ... } 

这会导致编译时错误,因为someMethod()尚未定义。 类也是如此。 类由编译器一个接一个地编译。

所以,如果你想象所有的类在编译之前被放到一个巨大的文件中,你可能已经看到了这个问题。 我们来看看Ship and BoatYard类:

 @interface BoatYard : NSObject @property (nonatomic, retain) Ship* currentShip; @end @interface Ship : NSObject @property (nonatomic, retain) NSString* name; @property (nonatomic, assign) float weight; @end 

再一次,因为Ship类尚未定义,我们现在还不能参考。 解决这个问题非常简单, 改变编译顺序并编译。 我敢肯定,你在XCode这个屏幕上的家庭:

但是你知道你可以在列表中上下拖动文件吗? 这改变了文件将被编译的顺序。因此,只要将Ship类移动到BoatYard类之上,并且都是好的。

但是,如果你不想这样做,或者更重要的是,如果两个对象之间存在循环关系呢? 让我们通过添加对Ship所在的当前BoatYard的引用来增加该对象图的复杂性:

 @interface BoatYard : NSObject @property (nonatomic, retain) Ship* currentShip; @end @interface Ship : NSObject @property (nonatomic, retain) BoatYard* currentBoatYard; @property (nonatomic, retain) NSString* name; @property (nonatomic, assign) float weight; @end 

哦,亲爱的,现在我们有一个问题。 这两个不能并行编译。 我们需要一种方法告知编译器Ship *类真的存在。 这就是@class关键字如此方便的原因。

用外行人的话来说,你是说:“相信我吧, Ship真的存在,你会很快看到它的。 把它放在一起:

 @class Ship; @interface BoatYard : NSObject @property (nonatomic, retain) Ship* currentShip; @end @interface Ship : NSObject @property (nonatomic, retain) BoatYard* currentBoatYard; @property (nonatomic, retain) NSString* name; @property (nonatomic, assign) float weight; @end 

现在编译器知道编译了BoatYardShip类的定义很快就会出现。 当然,如果没有,汇编仍然会成功。

所有的@class关键字不过是通知编译器,类很快就会出现。 它不是 #import的替代品。 您仍然必须导入头文件,否则您将无法访问任何类内部:

 @class Ship -(void) example { Ship* newShip = [[Ship alloc] init]; } 

这不能工作,并会失败,并显示Ship是前向声明。 一旦你#import "Ship.h" ,那么你将能够创build对象的实例。

我发现这个错误发生在头部有循环依赖的时候。 检查声明此方法的.h文件是否在ANObject.h中导入

你基本上添加

 @class ANObject; 

在@interface之前!

所以,出于某种原因,我试图在参数中设置一个枚举types的方法时出现这个错误。 像这样:

 - (void)foo:(MyEnumVariable)enumVariable; 

我以前曾经这样使用,从来没有问题,但现在我做了。 我检查了循环依赖,并且找不到任何东西。 我也多次检查错别字,没有骰子。 最终解决我的问题是在我想访问variables之前添加“枚举”。 像这样:

 - (void)foo:(enum MyEnumVariable)enumVariable; { enum MyEnumVariable anotherEnumVariable; } 

通常当我看到这样的错误时,这是​​因为我在上一行有一个错字,例如一个额外的或缺less的括号或其他东西。

这可能听起来很愚蠢,但错误的使用大写/小写字母错误的shell或错误的情况下。

我得到这个消息,当variablestypes拼写错误。 见下面这个下面

例如

 -(void)takeSimulatorSafePhotoWithPopoverFrame:(GCRect)popoverFrame { 

代替…..

 -(void)takeSimulatorSafePhotoWithPopoverFrame:(CGRect)popoverFrame { 

奇怪的是,改变我的import顺序已经解决了这个问题…尝试移动导入到所有其他import后的底部。