2012-07-20 49 views
30

在最新的工具,一种新的enum s的现在允许:在Objective-C新枚举

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

我的问题来自于部分:

  1. 我为什么要使用这个而不是旧的方式?

  2. 为什么CarType会出现两次?我尝试跳过第一个CarType,只是把第一行作为“typedef enum : NSUInteger {”,它似乎工作正常。有什么缺点?

  3. 可以使用NSUInteger以外的其他类型吗?

+6

+1张贴提高认识问题的答案。我没有听说过这个功能。 – 2012-07-20 09:12:56

回答

19
  1. 这明确定义了枚举使用的数字类型。这有助于便携性问题。如果您需要对签名和未签名的控制,这也有帮助

  2. 这里实际定义了两种类型。第一个是enum CarType,第二个是CarType,这是enum CarType的别名。如果你愿意,你可以省略第一个CarType。这只是防止enum CarType被定义的类型,但CarType仍然有效。人们所做的另一件常见的事情就像

    typedef enum _EnumName { 
        values 
    } EnumName; 
    

    你决定在这里做的事情是个人喜好的问题。

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

+0

除了以下划线和大写字母开头的标识符保留用于实现。 – dreamlax 2012-07-20 09:06:34

+0

我使用't'('tag')代替下划线,例如:typedef enum tMyEnum {...} MyEnum; – 2012-07-20 09:11:03

+0

这种新方法是否允许使用float/double? – 2012-07-20 09:12:06

3

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

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

37

由于这种新方法可以帮助你带有自动完成,switch语句,更好,更分别精确的警告,...

棒与宏...

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

...阅读这个例如https://stackoverflow.com/a/3190470/581190

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

+0

*它如何帮助自动完成,切换语句或警告? – 2013-07-31 15:17:01

+0

当你用这个宏定义枚举值时,它会向你显示警告,例如你在switch语句中不处理所有可能的情况。想象一下,你只有'Case FourDoorCarType:switch case'语句。它警告你,你不处理'TwoDoorCarType'等。 – robertvojta 2013-08-13 07:32:35

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 {,,它似乎工作正常。有什么缺点?

因为你命名enumCarType,然后你在typedef定义命名的新类型CarType为好。你不需要命名enum,因为你不能在任何地方使用它的名字。新类型的名称应该足够了。

可以使用NSUInteger以外的其他类型吗?

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

+0

以两个下划线开头的标识符是保留的,不应该使用。同样,以下划线和大写字母开头的标识符也是保留的。 – dreamlax 2012-07-20 12:20:47

+0

你是部分正确的,这种类型的名字是**真正的**保留:'__MATH__',但对于其他的ID,以两个下划线开头,没有约定,所以你可以像'__MATH'一样使用它们。 – holex 2012-07-20 12:48:19

+2

不,我是完全正确的,C标准§7.1.3说:*所有以下划线开头的标识符以及大写字母或其他下划线总是保留用于任何用途* – dreamlax 2012-07-20 13:26:58

3

一个大好处是,你可以用这种语法前瞻性声明枚举:

enum CarType : NSUInteger; 

,有助于避免包括其他头枚举定义的,只是因为大标题。

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