2010-04-02 13 views
15

En el código de ejemplo, he visto esto:Objetivo C: ¿cuándo debe "typedef" preceder a "enum" y cuándo se debe nombrar una enumeración?

typedef enum Ename { Bob, Mary, John} EmployeeName; 

y esto:

typedef enum {Bob, Mary, John} EmployeeName; 

y esto:

typedef enum {Bob, Mary, John}; 

pero lo compilado correctamente para mí era la siguiente:

enum {Bob, Mary, John}; 

Pongo esa línea en un archivo .h encima de la línea @interface, y luego cuando importo ese archivo .h en un archivo .m de clase diferente, los métodos pueden ver la enumeración.

Entonces, ¿cuándo se necesitan las otras variantes?

Si pudiera nombrar la enumeración algo así como EmployeeNames, y luego, cuando escribo "EmployeeNames" seguido de un ".", Sería bueno si aparece una lista que muestra cuáles son las opciones enum.

+0

También le puede interesar: http://stackoverflow.com/questions/1675351/typedef-struct-vs-struct-definitions –

Respuesta

22

En C (y por lo tanto en el Objetivo C), un tipo de enumeración debe tener el prefijo enum cada vez que lo utilice.

enum MyEnum enumVar; 

Al hacer un typedef:

typedef MyEnum MyEnumT; 

Puede escribir el más corto:

MyEnumT enumVar; 

Las declaraciones alternativas declaran la enumeración en sí y el typedef en una declaración.

// gives the enum itself a name, as well as the typedef 
typedef enum Ename { Bob, Mary, John} EmployeeName; 

// leaves the enum anonymous, only gives a name to the typedef 
typedef enum {Bob, Mary, John} EmployeeName; 

// leaves both anonymous, so Bob, Mary and John are just names for values of an anonymous type 
typedef enum {Bob, Mary, John}; 
+0

Estas son todas respuestas útiles. Esta idea de declarar una variable del tipo enumerado es intrigante. Al hacerlo, supongo, limita los posibles valores de la variable.Nunca he usado una enumeración así en otros idiomas. Acabo de utilizar la declaración enum como un titular de posibles valores. Por ejemplo: Si MyFish = FishSpecies.Mackeral Entonces ... o, mientras escribo, puedo conseguir IntelliSense de la siguiente manera: x = FishSpecies.Cod Hallibut Mackeral etc (Lo siento, no puede formatear esta en un comentario.) ¿Puede Xcode hacer ese tipo de IntelliSense con una enumeración, como VB? –

+0

@Scott: el problema es que en C los posibles nombres de valores enum se fusionan en el ámbito global (o en C++, entran en el mismo espacio de nombres en el que se declara el tipo enum). De hecho, 'FishSpecies' no contiene nada llamado' Cod'. Solo tienes que decir 'Cod'. En C++ es una buena práctica declarar siempre enumeraciones anidadas en alguna clase o espacio de nombres para evitar la contaminación del espacio de nombres global. En C++ 1x habrá una variedad enum mejorada donde escribirías 'FishSpecies :: Cod'. Y, por supuesto, en C#, VB.NET (y Java 5 o posterior, creo) ya obtienes aquello con lo que estás familiarizado. –

+0

Estoy bastante seguro de que Objective C se mantiene fiel a ANSI C simple además de las extensiones dinámicas de OO que están muy segregadas del resto del lenguaje. Enfoque totalmente diferente de C++ que también apunta a ser "una C mejor". Aunque la ventaja es que puedes combinar los dos idiomas y obtener Objective C++ (que es lo que usaría si incursionara en el desarrollo de iPhone, ya que no hay GC en el iPhone, y C++ permite una solución esencial llamada punteros inteligentes ... ¡búsquelos!) –

0

Su tercer ejemplo es el mismo que el último ejemplo - la typedef no es inútil - GCC incluso da una advertencia sobre este caso:

warning: useless storage class specifier in empty declaration 

Su primer y segundo ejemplo también son parte equivalente, en que ambos le dan a la enumeración un nombre EmployeeName. El primer ejemplo también le permite usar enum Ename de manera intercambiable con EmployeeName; en el segundo ejemplo, EmployeeName es la única opción. El segundo ejemplo debe escribirse como usted lo hizo: puede descomponer el primer ejemplo de la siguiente manera:

enum Ename { Bob, Mary, John }; 
typedef enum Ename EmployeeName; 

Quizás eso ayude a aclarar las cosas?

4

Los nombres dentro de enum { } definen los valores enumerados. Cuando le da un nombre, puede usarlo como un tipo junto con la palabra clave enum, p. Ej. enum EmployeeName b = Bob;. Si también lo tiene en typedef, puede soltar enum cuando declare variables de ese tipo, p. EmployeeName b = Bob; en lugar del ejemplo anterior.

Cuestiones relacionadas