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

我认为我根本不了解 enum 是什么,以及何时使用它。

例如:

typedef enum {
    kCircle,
    kRectangle,
    kOblateSpheroid
} ShapeType;

这里真正声明了什么?

最佳答案

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

最后,kCirclekRectanglekOblateSpheroid 被声明为全局命名空间中的整数常量。由于没有指定具体值,它们被分配给从 0 开始的连续整数,因此 kCircle 为 0,kRectangle 为 1,kOblateSpheroid 为2.

https://stackoverflow.com/questions/707512/

相关文章:

objective-c - 如何从 Swift 调用 Objective-C 代码?

objective-c - 在 Objective-C 中生成随机数

objective-c - @class 与 #import

ios - 如何在 Objective-C 中创建委托(delegate)?

ios - UITextView 中的占位符

ios - 如何为约束更改设置动画?

ios - 如何将 NSString 值转换为 NSData?

ios - 延迟后如何触发 block ,例如 -performSelector :withObje

ios - Objective-C 中的常量

ios - 如何查看iOS版本?