我不认为我从根本上理解枚举是什么,以及什么时候使用它。
例如:
typedef enum {
kCircle,
kRectangle,
kOblateSpheroid
} ShapeType;
这里真正声明的是什么?
我不认为我从根本上理解枚举是什么,以及什么时候使用它。
例如:
typedef enum {
kCircle,
kRectangle,
kOblateSpheroid
} ShapeType;
这里真正声明的是什么?
当前回答
enum (enumeration的缩写)用于枚举一组值(枚举器)。值是由符号(词)表示的抽象事物。 例如,基本枚举可以是
enum { xs,s,m,l,xl,xxl,xxxl,xxxxl };
此枚举被称为匿名,因为您没有符号来命名它。但它仍然是完全正确的。就像这样用
enum { xs,s,m,l,xl,xxl,xxxl,xxxxl } myGrandMotherDressSize;
好的。生活是美丽的,一切都很顺利。但是有一天你需要重用这个枚举来定义一个新变量来存储myGrandFatherPantSize,然后你写:
enum { xs,s,m,l,xl,xxl,xxxl,xxxxl } myGrandMotherDressSize;
enum { xs,s,m,l,xl,xxl,xxxl,xxxxl } myGrandFatherPantSize;
但是你有一个编译器错误“重定义枚举器”。实际上,问题是编译器不确定你的第一个枚举和你的第二个枚举描述的是同一件事。
然后,如果您想在多个地方重用同一组枚举数(这里是xs…xxxxl),则必须使用唯一的名称标记它。第二次使用这个集合时,只需使用标签即可。但是不要忘记,这个标记并不替换枚举词,而只是一组枚举数。然后注意像往常一样使用enum。是这样的:
// Here the first use of my enum
enum sizes { xs,s,m,l,xl,xxl,xxxl,xxxxl } myGrandMotherDressSize;
// here the second use of my enum. It works now!
enum sizes myGrandFatherPantSize;
你也可以在参数定义中使用它:
// Observe that here, I still use the enum
- (void) buyANewDressToMyGrandMother:(enum sizes)theSize;
可以说,在所有地方重写枚举并不方便,而且会使代码看起来有点奇怪。你说得对。真正的类型会更好。
这是我们向顶峰伟大前进的最后一步。通过添加typedef,我们可以将枚举转换为实类型。最后一点,typedef在类中是不允许的。然后在上面定义你的类型。这样做:
// enum definition
enum sizes { xs,s,m,l,xl,xxl,xxxl,xxxxl };
typedef enum sizes size_type
@interface myClass {
...
size_type myGrandMotherDressSize, myGrandFatherPantSize;
...
}
记住,标记是可选的。在这种情况下,我们不标记枚举数,而只是定义一个新类型。那我们就不再需要它了。
// enum definition
typedef enum { xs,s,m,l,xl,xxl,xxxl,xxxxl } size_type;
@interface myClass : NSObject {
...
size_type myGrandMotherDressSize, myGrandFatherPantSize;
...
}
@end
如果你在Objective-C中使用XCode开发,我会让你发现一些以NS_ENUM为前缀的宏。这将帮助您轻松地定义好的枚举,而且还将帮助静态分析器在编译之前为您做一些有趣的检查。
Enum好!
其他回答
用户定义的类型,其值可能为kCircle、kRectangle或koblabespheroid。但是,枚举内部的值(kCircle等)在枚举外部是可见的。记住这一点很重要(int i = kCircle;例如,有效的)。
这里声明了三件事:声明了一个匿名枚举类型,将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。
enum (enumeration的缩写)用于枚举一组值(枚举器)。值是由符号(词)表示的抽象事物。 例如,基本枚举可以是
enum { xs,s,m,l,xl,xxl,xxxl,xxxxl };
此枚举被称为匿名,因为您没有符号来命名它。但它仍然是完全正确的。就像这样用
enum { xs,s,m,l,xl,xxl,xxxl,xxxxl } myGrandMotherDressSize;
好的。生活是美丽的,一切都很顺利。但是有一天你需要重用这个枚举来定义一个新变量来存储myGrandFatherPantSize,然后你写:
enum { xs,s,m,l,xl,xxl,xxxl,xxxxl } myGrandMotherDressSize;
enum { xs,s,m,l,xl,xxl,xxxl,xxxxl } myGrandFatherPantSize;
但是你有一个编译器错误“重定义枚举器”。实际上,问题是编译器不确定你的第一个枚举和你的第二个枚举描述的是同一件事。
然后,如果您想在多个地方重用同一组枚举数(这里是xs…xxxxl),则必须使用唯一的名称标记它。第二次使用这个集合时,只需使用标签即可。但是不要忘记,这个标记并不替换枚举词,而只是一组枚举数。然后注意像往常一样使用enum。是这样的:
// Here the first use of my enum
enum sizes { xs,s,m,l,xl,xxl,xxxl,xxxxl } myGrandMotherDressSize;
// here the second use of my enum. It works now!
enum sizes myGrandFatherPantSize;
你也可以在参数定义中使用它:
// Observe that here, I still use the enum
- (void) buyANewDressToMyGrandMother:(enum sizes)theSize;
可以说,在所有地方重写枚举并不方便,而且会使代码看起来有点奇怪。你说得对。真正的类型会更好。
这是我们向顶峰伟大前进的最后一步。通过添加typedef,我们可以将枚举转换为实类型。最后一点,typedef在类中是不允许的。然后在上面定义你的类型。这样做:
// enum definition
enum sizes { xs,s,m,l,xl,xxl,xxxl,xxxxl };
typedef enum sizes size_type
@interface myClass {
...
size_type myGrandMotherDressSize, myGrandFatherPantSize;
...
}
记住,标记是可选的。在这种情况下,我们不标记枚举数,而只是定义一个新类型。那我们就不再需要它了。
// enum definition
typedef enum { xs,s,m,l,xl,xxl,xxxl,xxxxl } size_type;
@interface myClass : NSObject {
...
size_type myGrandMotherDressSize, myGrandFatherPantSize;
...
}
@end
如果你在Objective-C中使用XCode开发,我会让你发现一些以NS_ENUM为前缀的宏。这将帮助您轻松地定义好的枚举,而且还将帮助静态分析器在编译之前为您做一些有趣的检查。
Enum好!
Enum用于为枚举元素赋值,这在struct中无法完成。因此,每次访问完整变量时,我们可以通过在enum中分配给变量的值来完成。默认情况下,它以0赋值开始,但我们可以为它赋任何值,enum中的下一个变量将被赋值为前一个值+1。
typedef允许程序员将一种Objective-C类型定义为另一种。例如,
计数器;将Counter类型定义为等效于int类型。这极大地提高了代码的可读性。