2010-11-04 134 views
5

我在我的类的头顶部定义一个枚举:Objective-C枚举错误?

enum PresetSeq{kSeqClear=0, kSeqAllBeats, kSeqAllTicks}; 

但是,当我试图声明使用枚举该类中的方法。

-(void)quickSetSeq:(PresetSeq)pattern forChannel:(long)ch; 

我得到的错误: '之前PresetSeq'

如果我的typedef代替枚举预期 ')':

typedef enum {kSeqClear=0, kSeqAllBeats, kSeqAllTicks} PresetSeq; 

那么编译器是幸福的,但我不记得必须在C/C++中这样做。

枚举必须是obj-C中的typedef吗?

感谢

史蒂夫

附: - 我看到有关Obj-C枚举的其他文章,但不是为什么这个简单的例子失败。

回答

6

这些是C enum s。 (记住Objective-C只是C的一个严格的超集)。

来定义一个枚举类型,你必须使用typedef

不过,如果你并不需要有一个独立的(不enum前缀)来统称该枚举,那么你不需要typedef,你可以直接声明它是这样的:

enum PresetSeq { 
    kSeqClear, 
    kSeqAllBeats, 
    kSeqAllTicks 
}; 

所以,你的情况,你可以做任何一种方式:

typedef enum { 
    kSeqClear, 
    kSeqAllBeats, 
    kSeqAllTicks 
} PresetSeq; 

-(void)quickSetSeq:(PresetSeq)pattern forChannel:(long)ch; 

或者不typedef和使用enum PresetSeq语法如上图所示:

-(void)quickSetSeq:(enum PresetSeq)pattern forChannel:(long)ch; 
+0

感谢您的解释。你可知道,如果忽略这两个类型定义和枚举syntac在C++中是合法的吗?我似乎接受它 – Steve555 2010-11-04 06:45:53

+0

是,ommitting'struct'和'enum'(或不''typedef'ing和struct's'enum's)是完全合法的C++的一些旧的C++代码。正如添加'struct'或'enum'标签。 – 2010-11-04 06:59:02

+0

谢谢最大,这解释了很多我所看到的旧代码。 – Steve555 2010-11-04 09:57:41

4

如果你使用:

enum PresetSeq {kSeqClear=0, kSeqAllBeats, kSeqAllTicks}; 

那么你必须使用enum名称:

-(void)quickSetSeq:(enum PresetSeq)pattern forChannel:(long)ch; 

您最初的错误是因为有没有PresetSeq类型,只是一个enum PresetSeq一。

当您执行typedef版本时,会创建一个您可以使用的类型别名PresetSeq

这是完全一样的:

struct X {int a;}; 
typedef struct (int a;} Y; 

在这种情况下,你可以使用struct XY作为一种类型,但你不能对自己使用X

+0

感谢PAX(对不起,我没有足够的代表投了) – Steve555 2010-11-04 06:49:17

+0

有雅去,@Steve,现在你做:-)这并不重要,因为我已经达到了我的每日限价。 – paxdiablo 2010-11-04 06:57:17

+0

谢谢............. :) – Steve555 2010-11-04 09:58:24