3 回答
TA贡献1783条经验 获得超4个赞
三件事正在这里声明:匿名枚举类型声明,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。
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:链接到官方文档在这里。
TA贡献1875条经验 获得超5个赞
枚举声明了一组有序值 - typedef只是为此添加了一个方便的名称。第一个元素是0等
typedef enum {Monday=1,...} WORKDAYS;WORKDAYS today = Monday;
以上只是shapeType标签的枚举。
- 3 回答
- 0 关注
- 775 浏览
添加回答
举报