enum
es tan antiguo como C
, por lo tanto, una parte de Objective-C
. Es solo una codificación explícita de tipo int
. Es bastante útil para la depuración y la mayoría de los compiladores más nuevos pueden realizar optimizaciones basadas en él. (Lo cual debes ignorar por completo). Es más útil para hacer que tu código sea más legible (para cualquier otra persona o para ti después de que hayas dormido).
typedef enum {
...
} NameType ;
sería seguido por
NameType name;
y eso es por lo general el estilo preferido de un typedef,
su segundo ejemplo no atar el typedef a los valores que desee para especificar deberían solo ser del tipo dado.
Tenga en cuenta que esto no le impide ejecutar
name = 10244; // some non-valid value not listed in the enumeration
pero algunos compiladores podría generar una advertencia en ese caso,
me encontré con uso de Apple de la siguiente hoy:
enum {
NSFetchedResultsChangeInsert = 1,
NSFetchedResultsChangeDelete = 2,
NSFetchedResultsChangeMove = 3,
NSFetchedResultsChangeUpdate = 4
};
typedef NSUInteger NSFetchedResultsChangeType;
Lo hacen porque realmente quiere que el NSFetchedResultsChangeType
sea del tipo que han definido como NSUInteger
.Este puede ser un int
pero también puede ser otra cosa. Y con valores de 1, 2, 3 y 4, es algo irrelevante para us de qué tipo es. Pero están codificando a un nivel diferente de abstracción porque son un proveedor de herramientas.
Nunca debe mirar a Apple para codificar sugerencias de estilo. Si ve algo que parece que es una forma más limpia/mejor de codificar, generalmente lo es. Como Kevin mencionó, la estabilidad de API es de suma importancia para ellos.
Edición (Enero 2013) Si usted tiene acceso a los WWDC 2012 Sesión Vídeos, debe ver la Session 405 - Modern Objective-C
6: 00-10: 00. Se debate una nueva sintaxis en el compilador más nuevo que permite el tamaño explícito de un tipo y la vinculación estrecha de los valores a los tipos. (tomado de C++ 11)
enum NSFetchedResultsChangeType : NSUInteger {
NSFetchedResultsChangeInsert = 1,
NSFetchedResultsChangeDelete = 2,
NSFetchedResultsChangeMove = 3,
NSFetchedResultsChangeUpdate = 4
};
el segundo deriva un tipo de NSUInteger, no el primero. –