我不认为我从根本上理解枚举是什么,以及什么时候使用它。
例如:
typedef enum {
kCircle,
kRectangle,
kOblateSpheroid
} ShapeType;
这里真正声明的是什么?
我不认为我从根本上理解枚举是什么,以及什么时候使用它。
例如:
typedef enum {
kCircle,
kRectangle,
kOblateSpheroid
} ShapeType;
这里真正声明的是什么?
当前回答
Enum用于为枚举元素赋值,这在struct中无法完成。因此,每次访问完整变量时,我们可以通过在enum中分配给变量的值来完成。默认情况下,它以0赋值开始,但我们可以为它赋任何值,enum中的下一个变量将被赋值为前一个值+1。
其他回答
Enum用于为枚举元素赋值,这在struct中无法完成。因此,每次访问完整变量时,我们可以通过在enum中分配给变量的值来完成。默认情况下,它以0赋值开始,但我们可以为它赋任何值,enum中的下一个变量将被赋值为前一个值+1。
64位更改的更新: 根据苹果关于64位变化的文档,
枚举也是类型化的:在LLVM编译器中,枚举类型可以 定义枚举的大小。这意味着一些枚举 类型的大小也可能比您期望的要大。的 和其他情况一样,解是对a不做任何假设 数据类型的大小。相反,将任何枚举值赋给变量 使用适当的数据类型
因此,如果您支持64位,则必须创建具有以下语法类型的enum。
typedef NS_ENUM(NSUInteger, ShapeType) {
kCircle,
kRectangle,
kOblateSpheroid
};
or
typedef enum ShapeType : NSUInteger {
kCircle,
kRectangle,
kOblateSpheroid
} ShapeType;
否则,它将导致警告隐式转换丢失整型精度:NSUInteger (aka 'unsigned long')到ShapeType
swift编程更新:
在swift中,有一个语法变化。
enum ControlButtonID: NSUInteger {
case kCircle , kRectangle, kOblateSpheroid
}
这里声明了三件事:声明了一个匿名枚举类型,将ShapeType声明为该匿名枚举的类型定义,将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声明为匿名枚举的类型定义名称。ShapeType实际上只是一个整型,应该只用于声明包含声明中列出的值之一的变量(即kCircle、kRectangle和kOblateSpheroid之一)。不过,您可以通过强制转换为ShapeType变量分配另一个值,因此在读取enum值时必须小心。
最后,kCircle、kRectangle和kOblateSpheroid在全局命名空间中被声明为整数常量。由于没有指定特定的值,它们被分配给以0开头的连续整数,因此kCircle为0,kRectangle为1,kOblateSpheroid为2。
Typedef对于重新定义现有变量类型的名称非常有用。它提供了调用数据类型的简短而有意义的方式。 例句:
typedef unsigned long int TWOWORDS;
这里,unsigned long int类型被重新定义为TWOWORDS类型。因此,我们现在可以声明unsigned long int类型的变量:
TWOWORDS var1, var2;
而不是
unsigned long int var1, var2;
typedef enum {
kCircle,
kRectangle,
kOblateSpheroid
} ShapeType;
然后你可以这样使用它:-
ShapeType shape;
and
enum {
kCircle,
kRectangle,
kOblateSpheroid
}
ShapeType;
现在你可以这样使用它:-
enum ShapeType shape;