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

例如:

typedef enum {
    kCircle,
    kRectangle,
    kOblateSpheroid
} ShapeType;

这里真正宣布的是什么?

推荐答案

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

我们来分析一下.在最简单的情况下,枚举可以声明为

enum tagname { ... };

这将声明一个标记为tagname的枚举.在C和ObjuleC(但not C++)中,对这must的任何引用都是在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.

Objective-c相关问答推荐

如何使用 iOS 7 SpriteKit 粒子向非游戏的 iOS 应用程序添加粒子效果?

单例实例与类方法

如何使用第一个字符作为部分名称

如何更改 UIButton 的突出显示 colored颜色 ?

如何在 iOS Objective-C 头文件中将函数标记为已弃用?

使用 ARC,什么更好:alloc 或 autorelease 初始化程序?

NSFileManager 唯一的文件名

Iphone,获取 NSArray 中的国家/地区列表

如果用户禁用了应用程序的推送,是否可以进行静默远程通知?

如何调整 UIModalPresentationFormSheet 的大小?

StoryBoard 助理编辑器停止显示相关文件

Xcode 在您的 keys 串中找不到此配置文件的有效私有证书/有效密钥对

使用 NSLog 打印 NSData

自定义导航栏样式 - iOS

如何像在 Spotify 的播放器中一样创建居中的 UICollectionView

检测 UITableView 滚动

iPhone 正确使用 Application Delegate

使用 Objective-C 发布多部分/表单数据

如何使用图像和标签制作自定义 UIBarButtonItem?

Unwind Segue 在 iOS 8 中不起作用