enum
столько же лет, сколько C
, поэтому является частью Objective-C
.Это просто явное кодирование типа int
.Это довольно полезно для отладки, и большинство новых компиляторов могут делать оптимизации на его основе.(Что вы должны полностью игнорировать).Это наиболее полезно для того, чтобы сделать ваш код более читабельным (кому-либо еще или себе после того, как вы выспались). За
typedef enum {
...
} NameType ;
последует
NameType name;
, и обычно этопредпочтительный стиль typedef,
ваш второй пример будет не связывать typedef со значениями, которые вы хотите указать, должен быть только данного типа.
Обратите внимание, что этоне мешает вам выполнить
name = 10244; // some non-valid value not listed in the enumeration
, но в этом случае некоторые компиляторы могут выдавать предупреждение:
Сегодня я столкнулся с тем, что Apple использует следующее:
enum {
NSFetchedResultsChangeInsert = 1,
NSFetchedResultsChangeDelete = 2,
NSFetchedResultsChangeMove = 3,
NSFetchedResultsChangeUpdate = 4
};
typedef NSUInteger NSFetchedResultsChangeType;
Они делают это, потому что действительно хотят, чтобы NSFetchedResultsChangeType
был того типа, который они определили как NSUInteger
.Это может быть int
, но может быть и чем-то другим.И со значениями 1, 2, 3 и 4, это несколько не имеет отношения к us , что это за тип.Но они кодируют на другой уровень абстракции, потому что они являются поставщиком инструментов.
Вам никогда не следует обращаться к Apple за подсказками в стиле кодирования. Если вы видите что-то, что выглядит чище /лучший способ кодирования, это обычно так.Как упомянул Кевин, стабильность API для них имеет первостепенное значение.
Редактировать (январь 2013 г.) Если у вас есть доступ к Видео сессий WWDC 2012, вы должны посмотреть Session 405 - Modern Objective-C
6: 00-10: 00.Обсуждается новый синтаксис в новом компиляторе, который позволяет явно определять размер типа и тесно связывать значения с типами.(заимствовано из C ++ 11)
enum NSFetchedResultsChangeType : NSUInteger {
NSFetchedResultsChangeInsert = 1,
NSFetchedResultsChangeDelete = 2,
NSFetchedResultsChangeMove = 3,
NSFetchedResultsChangeUpdate = 4
};