Подтвердить что ты не робот

Новое перечисление в Objective-C

В новейших инструментах теперь разрешен новый тип enum:

typedef enum CarType : NSUInteger {
  FourDoorCarType,
  TwoDoorCarType
} CarType;

Мой вопрос приходит по частям:

  • Почему я должен использовать это вместо старого?

  • Почему CarType появляется дважды? Я пробовал пропустить первый CarType и просто оставил первую строку как "typedef enum : NSUInteger {", и, похоже, она работает нормально. Каковы недостатки, если таковые имеются?

  • Можно использовать некоторые типы, кроме NSUInteger?

4b9b3361

Ответ 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