Я не думаю, что я принципиально понимаю, что такое enum
и когда его использовать.
Например:
typedef enum {
kCircle,
kRectangle,
kOblateSpheroid
} ShapeType;
Что на самом деле здесь заявлено?
objective-c
enums
typedef
Craig
источник
источник
Ответы:
Три вещи объявляются здесь: анонимный перечисляемого типа объявляется,
ShapeType
в настоящее время объявлен ЬурейеЕ для этого анонимного перечисления, и три имениkCircle
,kRectangle
иkOblateSpheroid
объявляются в качестве интегральных констант.Давайте разберемся с этим. В простейшем случае перечисление может быть объявлено как
Это объявляет перечисление с тегом
tagname
. В C и Objective-C (но не в C ++) любые ссылки на это должны предшествоватьenum
ключевым словом. Например:Чтобы избежать необходимости
enum
везде использовать ключевое слово, можно создать typedef:Это можно упростить в одну строку:
И , наконец, если мы не должны быть в состоянии использовать
enum tagname
сenum
ключевым словом, мы можем сделатьenum
анонимное и только объявить его с именем ЬурейиМ:Теперь, в этом случае, мы объявляем,
ShapeType
что это имя типа анонимного перечисления, определенное с помощью typedef.ShapeType
на самом деле просто целочисленный тип, и должен использоваться только для объявления переменных , которые удерживают одно из значений , указанных в декларации (то есть, один изkCircle
,kRectangle
, иkOblateSpheroid
). Вы можете присвоитьShapeType
переменной другое значение путем приведения, поэтому вы должны быть осторожны при чтении значений перечисления.И, наконец,
kCircle
,kRectangle
иkOblateSpheroid
объявлены как интегральные константы в глобальном пространстве имен. Поскольку конкретные значения не указаны, они присваиваются последовательным целым числам, начиная с 0, поэтомуkCircle
0,kRectangle
1,kOblateSpheroid
2.источник
Apple рекомендует определять перечисления как это начиная с Xcode 4.4 :
Они также предоставляют удобный макрос
NS_ENUM
:Эти определения обеспечивают более строгую проверку типов и лучшее завершение кода. Я не смог найти официальную документацию
NS_ENUM
, но вы можете посмотреть видео "Modern Objective-C" с сессии WWDC 2012 здесь .ОБНОВЛЕНИЕ
Ссылка на официальную документацию здесь .
источник
NS_ENUM
макроса Apple от NSHipster: NSHipster.com/ns_enum-ns_optionsПеречисление объявляет набор упорядоченных значений - typedef просто добавляет к этому удобное имя. 1-й элемент 0 и т. Д.
Выше приведено только перечисление тегов shapeType.
источник
Пользователь определен тип , который имеет возможные значения
kCircle
,kRectangle
илиkOblateSpheroid
. Однако значения внутри перечисления (kCircle и т. Д.) Видны за пределами перечисления. Важно помнить это (int i = kCircle;
допустимо, например).источник
Обновление для 64-битных изменений: согласно документам Apple о 64-битных изменениях,
Поэтому вы должны создать enum с типом, как показано ниже, с синтаксисом, если вы поддерживаете 64-битную версию.
или
В противном случае это приведет к предупреждению
Implicit conversion loses integer precision: NSUInteger (aka 'unsigned long') to ShapeType
Обновление для swift-программирования:
В быстром, есть изменение синтаксиса.
источник
Перечисление (сокращение от перечисления) используется для перечисления набора значений (перечислителей). Значение - это абстрактная вещь, представленная символом (словом). Например, базовое перечисление может быть
Это перечисление называется анонимным, потому что у вас нет символа, чтобы назвать его. Но это все еще совершенно правильно. Просто используйте это так
Хорошо. Жизнь прекрасна, и все идет хорошо. Но однажды вам нужно повторно использовать это перечисление, чтобы определить новую переменную для хранения myGrandFatherPantSize, и тогда вы напишите:
Но тогда у вас есть ошибка компилятора "переопределение перечислителя". На самом деле, проблема в том, что компилятор не уверен, что вы сначала перечислили, а вы - второе, описали то же самое.
Затем, если вы хотите повторно использовать один и тот же набор перечислителей (здесь xs ... xxxxl) в нескольких местах, вы должны пометить его уникальным именем. Во второй раз, когда вы используете этот набор, вы просто должны использовать тег. Но не забывайте, что этот тег не заменяет слово enum, а только набор перечислителей. Затем позаботьтесь о том, чтобы использовать enum как обычно. Нравится:
Вы также можете использовать его в определении параметра:
Можно сказать, что переписывать enum везде не удобно, и код выглядит немного странно. Вы правы. Реальный тип был бы лучше.
Это последний шаг нашего великого продвижения к вершине. Просто добавив typedef, давайте превратим наше перечисление в реальный тип. О, последнее, typedef не разрешен в вашем классе. Затем определите ваш тип выше. Делай это так:
Помните, что тег необязателен. Тогда, поскольку здесь, в этом случае, мы не помечаем перечислители, а просто определяем новый тип. Тогда нам это больше не нужно.
Если вы разрабатываете в Objective-C с XCode, я позволю вам обнаружить несколько хороших макросов с префиксом NS_ENUM. Это должно помочь вам легко определить хорошие перечисления и, кроме того, поможет статическому анализатору выполнить некоторые интересные проверки перед сборкой.
Хороший Enum!
источник
typedef
полезно для переопределения имени существующего типа переменной. Это обеспечивает короткий и значимый способ вызова типа данных. например:здесь тип unsigned long int переопределяется как тип TWOWORDS. Таким образом, теперь мы можем объявить переменные типа unsigned long int, написав
вместо
источник
тогда вы можете использовать его как: -
а также
Теперь вы можете использовать его как: -
источник
enum используется для присвоения значения элементам enum, что невозможно сделать в структуре. Таким образом, каждый раз вместо доступа к полной переменной мы можем делать это по значению, которое мы присваиваем переменным в enum. По умолчанию он начинается с присвоения 0, но мы можем присвоить ему любое значение, а следующей переменной в enum будет присвоено значение, равное предыдущему значению +1.
источник
Вы можете использовать в следующем формате, необработанное значение по умолчанию, начиная с 0, так
Вы можете назначить свое собственное начальное значение.
источник
Определение типа позволяет программисту определять один тип Objective C как другой. Например,
typedef int Counter; определяет тип Counter как эквивалентный типу int. Это значительно улучшает читабельность кода.
источник
Typedef - ключевое слово в C и C ++. Он используется для создания новых имен для основных типов данных (char, int, float, double, struct & enum) .
Здесь он создает перечислимый тип данных ShapeType, и мы можем написать новые имена для перечисляемого типа ShapeType, как показано ниже
источник
enum может уменьшить количество типов «ошибок» и сделать код более управляемым
Определение не имеет ограничений. Это просто замена. Он не способен ограничивать все условия государства. Когда STATE назначен на 5, программа будет неправильной, потому что нет соответствующего состояния. Но компилятор не собирается предупреждать STATE = 5
Так что лучше так использовать
источник