在Objective-C中,typedef enum是什么?
在Objective-C中,typedef enum是什么?
我不认为我完全理解enum
是什么,以及何时使用它。
例如:
typedef enum { kCircle, kRectangle, kOblateSpheroid } ShapeType;
这里真正声明的是什么?
自从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”视频中查看这里。
更新
官方文档链接在这里。
这里声明了三个东西:声明了一个匿名枚举类型,声明了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
关键字和enum tagname
,则可以使enum
匿名,并仅使用typedef名称进行声明:
typedef enum { ... } tagname;
现在,在这种情况下,我们声明ShapeType
为一个匿名枚举的typedef名称。 ShapeType
实际上只是一个整数类型,应仅用于声明保存在声明中列出的值之一(也就是kCircle
、kRectangle
和kOblateSpheroid
中的一个)的变量。您可以通过强制转换将ShapeType
变量分配给另一个值,因此在读取枚举值时必须小心。
最后,在全局命名空间中将kCircle
、kRectangle
和kOblateSpheroid
声明为整数常量。由于没有指定特定值,它们将被分配给从0开始的连续整数,因此kCircle
为0, kRectangle code>为1,
kOblateSpheroid
为2。