enum
è vecchio come C
, quindi una parte di Objective-C
. È solo la codifica esplicita di un tipo int
. È abbastanza utile per il debug e la maggior parte dei più recenti compilatori possono fare ottimizzazioni basate su di esso. (Che dovresti assolutamente ignorare). È molto utile per rendere il tuo codice più leggibile (a chiunque altro oa te stesso dopo aver dormito).
typedef enum {
...
} NameType ;
sarebbe stata seguita da
NameType name;
e questo è in genere lo stile preferito di un typedef,
tuo secondo esempio sarà non legare il typedef per i valori che si desidera specificare dovrebbe solo essere del tipo dato.
Si noti che questo non impedisce di eseguire
name = 10244; // some non-valid value not listed in the enumeration
ma alcuni compilatori potrebbe generare un avviso in tal caso,
mi sono imbattuto in uso di Apple di quanto segue oggi:
enum {
NSFetchedResultsChangeInsert = 1,
NSFetchedResultsChangeDelete = 2,
NSFetchedResultsChangeMove = 3,
NSFetchedResultsChangeUpdate = 4
};
typedef NSUInteger NSFetchedResultsChangeType;
Lo fanno perché sono veramente desidera che il NSFetchedResultsChangeType
sia del tipo definito come NSUInteger
.Questo può essere essere un int
ma può anche essere qualcos'altro. E con i valori di 1, 2, 3 e 4, è un po 'irrilevante per us di che tipo si tratta. Ma stanno programmando un diverso livello di astrazione perché sono un fornitore di strumenti.
Non si dovrebbe mai guardare ad Apple per i suggerimenti sullo stile di codifica. Se vedi qualcosa che sembra il modo più pulito/migliore di codificare, di solito lo è. Come ha detto Kevin, la stabilità delle API è di fondamentale importanza per loro.
Edit (gennaio 2013) Se si ha accesso alle WWDC 2012 di sessione video, si dovrebbe guardare Session 405 - Modern Objective-C
6: 00-10: 00. È in discussione una nuova sintassi nel compilatore più recente che consente il dimensionamento esplicito di un tipo e il legame stretto dei valori con i tipi. (preso in prestito da C++ 11)
enum NSFetchedResultsChangeType : NSUInteger {
NSFetchedResultsChangeInsert = 1,
NSFetchedResultsChangeDelete = 2,
NSFetchedResultsChangeMove = 3,
NSFetchedResultsChangeUpdate = 4
};
il secondo deriva un tipo da NSUInteger, non il primo. –