在最新的工具中,现在允许使用新的enum
:
typedef enum CarType : NSUInteger {
FourDoorCarType,
TwoDoorCarType
} CarType;
我的问题部分来了:
为什么我应该使用它而不是旧方式?
为什么CarType
出现两次?我尝试跳过第一个CarType
并将第一行留作“typedef enum : NSUInteger {
”,它似乎工作正常。有什么缺点,如果有的话?
是否可以使用NSUInteger
以外的某些类型?
答案 0 :(得分:37)
因为这种新方法可以帮助您自动完成,切换语句,更好,更精确的警告,...
坚持使用宏......
typedef NS_ENUM( NSUInteger, CarType ) {
FourDoorCarType,
TwoDoorCarType
};
...请阅读此示例https://stackoverflow.com/a/3190470/581190
NSInteger,...你想要什么类型?
答案 1 :(得分:19)
这明确定义了枚举使用的数字类型。这有助于解决可移植性问题。如果您需要控制已签名与未签名
这里实际定义了两种类型。第一个是enum CarType
,第二个是CarType
,它是enum CarType
的别名。如果需要,可以省略第一个CarType
。这只是阻止enum CarType
成为已定义的类型,但CarType
仍然有效。人们常做的另一件事就是
typedef enum _EnumName {
values
} EnumName;
您决定在这里做的事情是个人偏好。
是。您可以使用任何数字类型,但枚举值必须能够适合所选类型。
答案 2 :(得分:4)
一个很大的优点是您可以使用以下语法转发声明枚举:
enum CarType : NSUInteger;
这有助于避免因为枚举定义而在其他标头中包含大标头。
答案 3 :(得分:3)
对于第2点:它是来自C:typedef <something> <alias>
的“相同的旧语法”。在此,something
为enum <enumIdent> { <a, b, c, d, ...> }
。
您可以简单地使用enumIdent
和alias
的相同名称。
答案 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 */`