Перечисление (сокращение перечисления) используется для перечисления набора значений (перечислители). Значение - это абстрактная вещь, представленная символом (словом).
Например, базовое перечисление может быть
enum { xs,s,m,l,xl,xxl,xxxl,xxxxl };
Это перечисление называется анонимным, потому что у вас нет символа, чтобы назвать его. Но это все еще совершенно правильно. Просто используйте это так
enum { xs,s,m,l,xl,xxl,xxxl,xxxxl } myGrandMotherDressSize;
Хорошо. Жизнь прекрасна, и все идет хорошо. Но однажды вам нужно повторно использовать это перечисление, чтобы определить новую переменную для хранения myGrandFatherPantSize, а затем вы напишите:
enum { xs,s,m,l,xl,xxl,xxxl,xxxxl } myGrandMotherDressSize;
enum { xs,s,m,l,xl,xxl,xxxl,xxxxl } myGrandFatherPantSize;
Но тогда у вас есть ошибка компилятора "переопределение перечислителя". На самом деле проблема в том, что компилятор не уверен, что вы первый перечислите, а вы второй описываете то же самое.
Тогда, если вы хотите повторно использовать один и тот же набор перечислителей (здесь xs ... xxxxl) в нескольких местах, вы должны пометить его уникальным именем. Во второй раз, когда вы используете этот набор, вы просто должны использовать тег. Но не забывайте, что этот тег не заменяет слово enum, а только набор перечислителей. Затем позаботьтесь о том, чтобы использовать enum как обычно. Как это:
// Here the first use of my enum
enum sizes { xs,s,m,l,xl,xxl,xxxl,xxxxl } myGrandMotherDressSize;
// here the second use of my enum. It works now!
enum sizes myGrandFatherPantSize;
вы также можете использовать его в определении параметра:
// Observe that here, I still use the enum
- (void) buyANewDressToMyGrandMother:(enum sizes)theSize;
Можно сказать, что переписывание enum везде не удобно и делает код немного странным. Вы правы. Реальный тип был бы лучше.
Это последний шаг нашего великого продвижения к вершине. Просто добавив typedef, давайте превратим наше перечисление в реальный тип. О, последнее, typedef не разрешен в вашем классе. Затем определите ваш тип выше. Сделайте это так:
// enum definition
enum sizes { xs,s,m,l,xl,xxl,xxxl,xxxxl };
typedef enum sizes size_type
@interface myClass {
...
size_type myGrandMotherDressSize, myGrandFatherPantSize;
...
}
Помните, что тег необязателен. Тогда, поскольку здесь, в этом случае, мы не помечаем перечислители, а просто определяем новый тип. Тогда нам это больше не нужно.
// enum definition
typedef enum { xs,s,m,l,xl,xxl,xxxl,xxxxl } size_type;
@interface myClass : NSObject {
...
size_type myGrandMotherDressSize, myGrandFatherPantSize;
...
}
@end
Если вы разрабатываете в Objective-C с XCode, я позволю вам обнаружить несколько хороших макросов с префиксом NS_ENUM. Это должно помочь вам легко определить хорошие перечисления и, кроме того, поможет статическому анализатору выполнить некоторые интересные проверки перед сборкой.
Добрый день!