Objective中的typedef枚举是什么?

我不认为我从根本上理解enum是什么,以及何时使用它。

例如:

typedef enum {
    kCircle,
    kRectangle,
    kOblateSpheroid
} ShapeType;

这里真的宣布了什么?


这里声明了三件事:声明了匿名枚举类型,将ShapeType声明为该匿名枚举的typedef,并将三个名称kCirclekRectanglekOblateSpheroid声明为整型常量。

让我们来分解一下。 在最简单的情况下,枚举可以被声明为

enum tagname { ... };

这用标记tagname声明枚举。 在C和Objective-C(但不是C ++)中,任何对此的引用必须以enum关键字开头。 例如:

enum tagname x;  // declare x of type 'enum tagname'
tagname x;  // ERROR in C/Objective-C, OK in C++

为了避免必须在任何地方使用enum关键字,可以创建一个typedef:

enum tagname { ... };
typedef enum tagname tagname;  // declare 'tagname' as a typedef for 'enum tagname'

这可以简化为一行:

typedef enum tagname { ... } tagname;  // declare both 'enum tagname' and 'tagname'

最后,如果我们不需要能够使用enum tagnameenum关键字,我们可以使enum匿名,只与typedef名称声明它:

typedef enum { ... } tagname;

现在,在这种情况下,我们声明ShapeType是一个匿名枚举类型化的名称。 ShapeType实际上只是一个整型,只能用于声明保存声明中列出的值之一的变量(即kCirclekRectanglekOblateSpheroid )。 但是,您可以通过强制转换为ShapeType变量赋予另一个值,因此在读取枚举值时必须小心。

最后, kCirclekRectanglekOblateSpheroid在全局命名空间中声明为整型常量。 由于没有指定具体的值,因此将它们分配给从0开始的连续整数,所以kCircle为0, kRectangle为1, kOblateSpheroid为2。


Apple建议自Xcode 4.4开始定义这样的枚举:

typedef enum ShapeType : NSUInteger {
    kCircle,
    kRectangle,
    kOblateSpheroid
} ShapeType;

他们还提供了一个方便的宏NS_ENUM:

typedef NS_ENUM(NSUInteger, ShapeType) {
    kCircle,
    kRectangle,
    kOblateSpheroid
};

这些定义提供更强的类型检查和更好的代码完成。 我找不到NS_ENUM的官方文档,但您可以在这里观看WWDC 2012会话中的“Modern Objective-C”视频。

更新:链接到这里的官方文档。


枚举声明了一组有序值 - typedef只是为此添加了一个方便的名称。 第一个元素是0等。

typedef enum {
Monday=1,
...
} WORKDAYS;

WORKDAYS today = Monday;

以上只是shapeType标签的枚举。

链接地址: http://www.djcxy.com/p/5993.html

上一篇: What is a typedef enum in Objective

下一篇: Constants in Objective