为什么XCode不会从正确导入的标头中识别出typedef?

时间:2012-09-09 16:43:26

标签: objective-c ios typedef

这非常奇怪,让我疯了。我曾经有一个名为Constants的班级。这是typedef

typedef enum visible_thing {

    BACKGROUND,
    BACKGROUND_COLOR,
    MAIN_WINDOW

} VISIBLE_THING;

而我的生活很美好!我在任何需要访问此类型的地方导入'Constants.h`,这一切都奏效了。

然后我决定去训练Constants课程。我接受了typedef并把它放在另一个类中,为了清楚起见,我们称之为OtherClass。我通过并将Constants.h的所有导入更改为导入OtherClass.h这就是我所做的全部,我没有触及任何其他代码。而现在整个事情都破了!

Constants完美配合的方法现在给了我这个错误:Parse Issue - Expected a type。有没有搞错?我当然希望有人在这方面有一些线索!

更新:令人沮丧的是,这是一个似乎在没有解释的情况下自行消失的问题之一。我在下面回答了我自己的问题,通过一种解决方法,我发现需要在一个文件中多次导入相同的标头。但今天我删除了额外的#import,一切仍然有效。精氨酸。计算机!

4 个答案:

答案 0 :(得分:8)

我得到了相同的“预期类型”,结果发现它是由导入循环引起的。我用以下简单的例子复制了它:

<强> A.H:

#import "B.h"

typedef enum {
    SomeEnumA
} SomeEnum;

@interface A : NSObject

@end

<强> B.h:

#import "A.h"

@interface B : NSObject

- (void) func:(SomeEnum)arg;

@end

编译器抱怨B.h中的SomeEnum未知 - 编译A.m(只导入A.h)。发生这种情况是因为A.h导入B.h,导入A.h.导入循环不会发生,因此在这种情况下,B.h不包括定义类型的A.h代码。

通过将枚举的定义移动到单独的SomeEnum.h,可以轻松解决该问题。

答案 1 :(得分:1)

我可能会试图弄清楚发生了什么,因为导致这种情况发生的原因可能会导致未来出现其他神秘错误,到那时你可能已经忘记了这一点,这可能会使跟踪变得更加困难降低未来错误的原因。

我会尝试隔离问题。你可以尝试一些事情:

  • 逐步注释掉InnerClass界面中的代码,看看是否可以解决问题。
  • 使用不同的类型名称在文件顶部手动添加typedef(并适当地编辑其余代码)以查看问题是否仍然存在。
  • 发布您的.h文件和OtherClass.h文件以查看是否有其他人可以发现问题
  • David H建议创建一个演示项目以确定是否可以重现问题

我认为这取决于你的项目是什么,如果它只是一个小而快的东西,你想要工作,它可能没关系,但如果它将是一个更大的项目,你认为你的代码库扩大,或者如果它也是其他程序员正在研究的东西,我会试着去理解这里发生的事情。

答案 2 :(得分:0)

生成错误的类在其中有两个其他类定义,仅在内部使用的辅助类。显然这是问题的根源。

我不知道的是,如果你这样做,如果文件中有多个类,你可能需要多次导入相同的标题。

以下是我为解决这个问题所做的工作。我改变了这个:

#import "OtherClass.h"

@interface InnerClass

// uses typedef from OtherClass

@end



@interface MainClass

// uses typedef from OtherClass

@end

对此:

#import "OtherClass.h"

@interface InnerClass

// uses typedef from OtherClass

@end

#import "OtherClass.h" //<--without this, MainClass won't recognize the typedef 

@interface MainClass

// uses typedef from OtherClass

@end

这看起来很笨拙,而且我可能在做其他错误,但至少它解决了手头的问题。任何后续评论都将受到赞赏。

答案 3 :(得分:0)

在尝试创建框架时,我偶然发现了这个。 Xcode不喜欢在接口上方定义typedef。不知道为什么会这样,但是已经解决了。

所以我从以下位置更改了我的位置:

typedef enum {
   MyOption1,   // option 1.
   MyOption2,   // option 2.
}MyOption;

@interface MyClass : NSObject

@property (strong, nonatomic) NSString *myString;

@end

收件人:

@interface MyClass : NSObject

typedef enum {
   MyOption1,   // option 1.
   MyOption2,   // option 2.
}MyOption;

@property (strong, nonatomic) NSString *myString;

@end