在Objective-C中,typedef enum是什么?

43 浏览
0 Comments

在Objective-C中,typedef enum是什么?

我不认为我完全理解enum是什么,以及何时使用它。

例如:

typedef enum {
    kCircle,
    kRectangle,
    kOblateSpheroid
} ShapeType;

这里真正声明的是什么?

admin 更改状态以发布 2023年5月22日
0
0 Comments

自从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”视频中查看这里


更新
官方文档链接在这里

0
0 Comments

这里声明了三个东西:声明了一个匿名枚举类型,声明了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关键字和enum tagname,则可以使enum匿名,并仅使用typedef名称进行声明:

typedef enum { ... } tagname;

现在,在这种情况下,我们声明ShapeType为一个匿名枚举的typedef名称。 ShapeType 实际上只是一个整数类型,应仅用于声明保存在声明中列出的值之一(也就是kCirclekRectanglekOblateSpheroid中的一个)的变量。您可以通过强制转换将ShapeType变量分配给另一个值,因此在读取枚举值时必须小心。

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

0