2010-11-04 10 views
5

he definido una enumeración en la parte superior de mi cabecera de la clase:Objective-C error de enum?

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

Pero cuando trato de declarar un método para esa clase mediante la enumeración.

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

me sale el error: se esperaba ')' antes 'PresetSeq'

Si typedef enum el lugar:

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

A continuación, el compilador es feliz, pero no me acuerdo tener que hacer eso en C/C++.

No tienen por qué ser las enumeraciones de typedef en Obj-C?

Gracias

Steve

P. S. - Vi otras publicaciones sobre Obj-C enums, pero no por qué este simple caso falla.

Respuesta

6

Estos son C enum s. (Recuerde que Objective-C es solo un superconjunto estricto de C).

Para definir un tipo enumerado , se debe utilizar typedef.

Sin embargo, si usted no necesita tener un independiente tipo (sin el enum prefijo) para referirse colectivamente a esa enumeración, entonces no es necesario typedef y puede declarar así:

enum PresetSeq { 
    kSeqClear, 
    kSeqAllBeats, 
    kSeqAllTicks 
}; 

Así, en su caso, puede hacerlo de cualquier manera:

typedef enum { 
    kSeqClear, 
    kSeqAllBeats, 
    kSeqAllTicks 
} PresetSeq; 

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

o sin typedef y el uso de la sintaxis enum PresetSeq de la imágen:

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

Gracias por la explicación. ¿Sabes por casualidad que si se omiten las sintaxis typedef y enum es legal en C++? Tengo un viejo código de C++ que parecía aceptarlo – Steve555

+0

Sí, omitir 'struct' y' enum' (o no 'typedef'ing' struct's y 'enum's) es perfectamente legal C++. Como está agregando la etiqueta 'struct' o' enum'. –

+0

Gracias Max, eso explica mucho de lo que estoy viendo en el código anterior. – Steve555

4

Si utiliza:

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

entonces debe utilizar el nombre enum:

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

su error inicial se debe a que es sin PresetSeq tipo, sólo una enum PresetSeq uno.

Cuando realiza la versión typedef, crea un alias de tipo PresetSeq que puede usar.

Es exactamente lo mismo que:

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

En ese caso, puede utilizar struct X o Y como un tipo pero no se puede utilizar X por sí sola.

+0

Gracias pax (lo siento, no tengo suficientes representantes para votar) – Steve555

+0

Ahí va, @Steve, ahora lo hace :-) No es que importe, ya que he alcanzado mi límite diario de rep. – paxdiablo

+0

Gracias ............. :) – Steve555

Cuestiones relacionadas