为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

倚天杖 2019-07-27 14:41:52
Objective-C中的typedef枚举是什么?我不认为我从根本上理解它enum是什么,何时使用它。例如:typedef enum {     kCircle,     kRectangle,     kOblateSpheroid} ShapeType;这里真的被宣布了什么?
查看完整描述

3 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

三件事正在这里声明:匿名枚举类型声明,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是匿名枚举的typedef名称。 ShapeType实际上只是一个整数类型,且只能用于声明持有在声明中列出的值中的一个变量(即,一kCirclekRectanglekOblateSpheroid)。但是,您可以ShapeType通过强制转换为变量赋值,因此在读取枚举值时必须小心。

最后kCirclekRectanglekOblateSpheroid被声明为全局命名空间的整型常量。由于未指定特定值,因此将它们分配给以0开头的连续整数,因此kCircle为0,kRectangle为1,kOblateSpheroid为2。


查看完整回答
反对 回复 2019-07-27
?
慕斯709654

TA贡献1840条经验 获得超5个赞

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:链接到官方文档在这里


查看完整回答
反对 回复 2019-07-27
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

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

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

以上只是shapeType标签的枚举。


查看完整回答
反对 回复 2019-07-27
  • 3 回答
  • 0 关注
  • 775 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信