Objective-C中的新枚举

时间:2012-07-20 08:56:16

标签: objective-c cocoa

在最新的工具中,现在允许使用新的enum

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

我的问题部分来了:

  1. 为什么我应该使用它而不是旧方式?

  2. 为什么CarType出现两次?我尝试跳过第一个CarType并将第一行留作“typedef enum : NSUInteger {”,它似乎工作正常。有什么缺点,如果有的话?

  3. 是否可以使用NSUInteger以外的某些类型?

6 个答案:

答案 0 :(得分:37)

因为这种新方法可以帮助您自动完成,切换语句,更好,更精确的警告,...

坚持使用宏......

typedef NS_ENUM( NSUInteger, CarType ) {
  FourDoorCarType,
  TwoDoorCarType
};

...请阅读此示例https://stackoverflow.com/a/3190470/581190

NSInteger,...你想要什么类型?

答案 1 :(得分:19)

  1. 这明确定义了枚举使用的数字类型。这有助于解决可移植性问题。如果您需要控制已签名与未签名

  2. ,这也会有所帮助
  3. 这里实际定义了两种类型。第一个是enum CarType,第二个是CarType,它是enum CarType的别名。如果需要,可以省略第一个CarType。这只是阻止enum CarType成为已定义的类型,但CarType仍然有效。人们常做的另一件事就是

    typedef enum _EnumName {
        values
    } EnumName;
    

    您决定在这里做的事情是个人偏好。

  4. 是。您可以使用任何数字类型,但枚举值必须能够适合所选类型。

答案 2 :(得分:4)

一个很大的优点是您可以使用以下语法转发声明枚举:

enum CarType : NSUInteger;

这有助于避免因为枚举定义而在其他标头中包含大标头。

答案 3 :(得分:3)

对于第2点:它是来自C:typedef <something> <alias>的“相同的旧语法”。在此,somethingenum <enumIdent> { <a, b, c, d, ...> }

您可以简单地使用enumIdentalias的相同名称。

答案 4 :(得分:1)

答案就在这里。

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 以外的某些类型?

是的,你可以,类型总是NSInteger,你不需要限制它们unsigned integer

答案 5 :(得分:1)

新的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 */`

Forward-declare enum in Objective-C