Objective-C中的typedef枚举是什么?

Objective-C中的typedef枚举是什么?

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

例如:

typedef enum {
    kCircle,
    kRectangle,
    kOblateSpheroid} ShapeType;

这里真的被宣布了什么?


倚天杖
浏览 781回答 3
3回答

慕娘9325324

三件事正在这里声明:匿名枚举类型声明,ShapeType在声明该匿名枚举一个typedef和三个名字kCircle,kRectangle和kOblateSpheroid被声明为整型常量。让我们打破它。在最简单的情况下,枚举可以声明为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 tagname与enum关键字,我们可以使enum匿名的,并且只与typedef名称声明它:typedef enum { ... } tagname;现在,在这种情况下,我们声明ShapeType是匿名枚举的typedef名称。 ShapeType实际上只是一个整数类型,且只能用于声明持有在声明中列出的值中的一个变量(即,一kCircle,kRectangle和kOblateSpheroid)。但是,您可以ShapeType通过强制转换为变量赋值,因此在读取枚举值时必须小心。最后kCircle,kRectangle和kOblateSpheroid被声明为全局命名空间的整型常量。由于未指定特定值,因此将它们分配给以0开头的连续整数,因此kCircle为0,kRectangle为1,kOblateSpheroid为2。

慕斯709654

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”视频。UPDATE:链接到官方文档在这里。

慕田峪4524236

枚举声明了一组有序值 - typedef只是为此添加了一个方便的名称。第一个元素是0等typedef enum {Monday=1,...} WORKDAYS;WORKDAYS today = Monday;以上只是shapeType标签的枚举。
打开App,查看更多内容
随时随地看视频慕课网APP