Новое перечисление в Objective-C
В новейших инструментах теперь разрешен новый тип enum
:
typedef enum CarType : NSUInteger {
FourDoorCarType,
TwoDoorCarType
} CarType;
Мой вопрос приходит по частям:
-
Почему я должен использовать это вместо старого?
-
Почему CarType
появляется дважды? Я пробовал пропустить первый CarType
и просто оставил первую строку как "typedef enum : NSUInteger {
", и, похоже, она работает нормально. Каковы недостатки, если таковые имеются?
-
Можно использовать некоторые типы, кроме NSUInteger
?
Ответы
Ответ 1
-
Это явно определяет числовой тип, который использует перечисление. Это помогает справиться с переносимостью. Это также помогает, если вам нужен контроль над подписанным vs. unsigned
-
Здесь определены два типа. Первый - enum CarType
, второй - CarType
, который является псевдонимом enum CarType
. Вы можете опустить первый CarType
, если хотите. Это просто предотвращает enum CarType
от определенного типа, но CarType
остается в силе. Еще одна распространенная вещь, которую люди делают, это что-то вроде
typedef enum _EnumName {
values
} EnumName;
То, что вы решили сделать здесь, - это вопрос личного предпочтения.
-
Да. Вы можете использовать любой числовой тип, хотя значения перечисления должны быть в состоянии соответствовать выбранному типу.
Ответ 2
Потому что этот новый способ помогает вам с автозавершением, оператором switch, лучше, соответственно более точными предупреждениями,...
Вставьте макрос...
typedef NS_ENUM( NSUInteger, CarType ) {
FourDoorCarType,
TwoDoorCarType
};
... читайте это, например fooobar.com/questions/174992/...
NSInteger,... какие типы вы хотите?
Ответ 3
Для точки 2: это "тот же старый синтаксис" от C: typedef <something> <alias>
. Здесь something
- enum <enumIdent> { <a, b, c, d, ...> }
.
Вы можете использовать одно и то же имя для enumIdent
и alias
, просто.
Ответ 4
Одним из больших преимуществ является то, что вы можете пересылать объявления с этим синтаксисом:
enum CarType : NSUInteger;
Это помогает избежать включения больших заголовков в другие заголовки только из-за определений перечислений.
Ответ 5
ответы будут здесь для вас.
typedef enum MYCARTYPE { // you could drop the ": NSInteger" part to you could drop the the MYCARTYPE name as well, if you like.
FourDoorCarType,
TwoDoorCarType
} CarType;
Почему я должен использовать это вместо старого?
вы можете использовать старый путь на текущем этапе.
Почему CarType
появляется дважды? Я пробовал пропустить первый CarType
и просто оставил первую строку как typedef enum : NSUInteger {
, и, похоже, работает нормально. Каковы недостатки, если таковые имеются?
потому что вы назвали enum
как CarType
, а затем вы назвали новый тип в typedef
определением как CarType
. вам не нужно называть enum
, потому что вы не можете использовать его имя где угодно. имя нового типа должно быть достаточно.
Можно использовать некоторые типы, кроме NSUInteger
?
yep, вы можете, типы всегда NSInteger
, вам не нужно их ограничивать unsigned integer
.
Ответ 6
Новый NS_ENUM также позволяет переслать объявление следующим образом:
// Forward declaration for XYZCharacterType in other header say XYZCharacter.h
typedef NS_ENUM(NSUInteger, XYZCharacterType);
// Enum declaration header: "XYZEnumType.h"
#ifndef XYZCharacterType_h
#define XYZCharacterType_h
typedef NS_ENUM(NSUInteger, XYZEnumType) {
XYZCharacterTypeNotSet,
XYZCharacterTypeAgent,
XYZCharacterTypeKiller,
};
#endif /* XYZCharacterType_h */`
То же, что и ответ, который я разместил на Переслать-объявить перечисление в Objective-C