【问题标题】:"Expected a type" error pointing to the return type of a method指向方法返回类型的“预期类型”错误
【发布时间】:2011-12-27 16:30:17
【问题描述】:

我尝试编译,但每次编译时,一个方法都会抛出一个奇怪的“预期类型”错误。我在标题中有一个方法:

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

错误指向此方法的返回类型。我已经使用#import "ANObject.h"ANObject 导入到标头中,ANObject 编译正常..

为什么会这样?

【问题讨论】:

  • 似乎没问题..你能发布你的代码的一部分吗?
  • 也... ANObject 是其他框架的一部分吗?
  • 请编辑您的问题以包括 ANObject.h 的内容和给您带来问题的标题。请出示您的实际代码,而不是可能不包含问题的虚构代码。

标签: objective-c xcode cocoa compilation compiler-errors


【解决方案1】:

奇怪的是,过去更改我的导入顺序已经解决了这个问题...尝试在所有其他导入之后将导入移到底部。

【讨论】:

    【解决方案2】:

    当变量类型拼写错误时,我收到了这条消息。看下面这个

    例如

    -(void)takeSimulatorSafePhotoWithPopoverFrame:(GCRect)popoverFrame {
    

    而不是.....

    -(void)takeSimulatorSafePhotoWithPopoverFrame:(CGRect)popoverFrame {
    

    【讨论】:

    • 我花了足够长的时间才弄清楚 CGRect 和 GCRect 的区别。
    【解决方案3】:

    你基本上加了

    @class ANObject;
    

    @interface 之前!

    【讨论】:

    • 我不知道如何解决我的问题。 #import 不起作用,@class 起作用..
    【解决方案4】:

    这听起来可能很愚蠢,但是错误的脱壳或错误使用大写/小写字母的大小写错误。

    【讨论】:

      【解决方案5】:

      因此,由于某种原因,我在尝试在参数中设置具有枚举类型的方法时遇到此错误。像这样:

      - (void)foo:(MyEnumVariable)enumVariable;
      

      我以前这样使用过它,从来没有遇到过问题,但现在我做到了。我检查了循环依赖,但找不到。我还多次检查错别字,没有骰子。最终解决我的问题是在我想访问变量之前添加“枚举”。像这样:

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

      【讨论】:

        【解决方案6】:

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

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

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

        因此,如果您想象在编译之前将所有类放入一个巨大的文件中,您可能已经看到了问题所在。我们来看看ShipBoatYard 类:

        @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
        

        现在编译器在编译BoatYard 时知道,Ship 类定义很快就会出现。当然,如果没有,编译仍然会成功。

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

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

        这不起作用,并且会失败并显示一条错误消息,指出 Ship 是前向声明。一旦你#import "Ship.h",那么你将能够创建对象的实例。

        【讨论】:

        • @burrows111:经过反思,这是一个非常懒惰的答案;我写的时候一定很着急。其他答案解释了如何解决它,但我看不到一个解释为什么会发生的答案。我希望编辑后的答案对您有所帮助。
        • 伙计,你会认为像 Obj-C 这样的语言已经解决了这个问题。这不是我第一次打这个,我总是对此感到惊讶。
        【解决方案7】:

        我发现当标头存在循环依赖时会发生此错误。检查您声明此方法的 .h 文件是否已导入 ANObject.h

        【讨论】:

        • 是的,由于循环依赖,我遇到了类似的错误。通过在接口文件中包含前向类声明并在实现中导入头文件来避免它。
        • 这解决了我的问题。尝试重新排序构建文件等,但没有帮助 - 我不明白为什么如果我包含必要的头文件会很重要(毕竟,这就是头文件要解决的问题 - 类型的预声明/在编译器遇到实际实现/主体之前的方法等)。原来我不小心创建了对标头的循环依赖。
        【解决方案8】:

        通常当我看到这样的错误时,是因为我在前一行有错字,例如多余的或缺少的括号或其他东西。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-26
          • 2023-04-06
          • 1970-01-01
          • 1970-01-01
          • 2013-12-06
          • 1970-01-01
          相关资源
          最近更新 更多