31

enum在最新的工具中,现在允许使用一种新的s:

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

我的问题分为几部分:

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

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

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

4

6 回答 6

37

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

坚持宏...

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

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

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

于 2012-07-20T09:04:42.867 回答
19
  1. 这明确定义了枚举使用的数字类型。这有助于解决可移植性问题。如果您需要控制已签名与未签名,它也会有所帮助

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

    typedef enum _EnumName {
        values
    } EnumName;
    

    您决定在这里做什么是个人喜好问题。

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

于 2012-07-20T08:59:31.943 回答
4

一大优势是您可以使用以下语法前向声明枚举:

enum CarType : NSUInteger;

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

于 2012-08-16T22:54:55.863 回答
3

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

您可以简单地为enumIdentand使用相同的名称alias

于 2012-07-20T08:58:28.933 回答
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 {它似乎工作正常。有什么缺点,如果有的话?

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

可以使用其他类型 NSUInteger 吗?

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

于 2012-07-20T09:21:21.267 回答
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 */`

在 Objective-C 中前向声明枚举

于 2017-02-06T17:20:19.177 回答