这非常奇怪,让我疯了。我曾经有一个名为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,一切仍然有效。精氨酸。计算机!
答案 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)
我可能会试图弄清楚发生了什么,因为导致这种情况发生的原因可能会导致未来出现其他神秘错误,到那时你可能已经忘记了这一点,这可能会使跟踪变得更加困难降低未来错误的原因。
我会尝试隔离问题。你可以尝试一些事情:
我认为这取决于你的项目是什么,如果它只是一个小而快的东西,你想要工作,它可能没关系,但如果它将是一个更大的项目,你认为你的代码库扩大,或者如果它也是其他程序员正在研究的东西,我会试着去理解这里发生的事情。
答案 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