enum(枚举的缩写)用于枚举一组值(枚举数)。值是由符号(一个词)表示的抽象事物。
例如,一个基本的枚举可以是
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),则必须使用唯一名称对其进行标记。第二次使用此设置时,您只需使用标签。但不要忘记,这个标签不会替换枚举词,而只是替换枚举数的集合。然后照常注意使用枚举。像这样:
// 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
如果您使用 XCode 在 Objective-C 中进行开发,我会让您发现一些以 NS_ENUM 为前缀的好宏。这应该可以帮助您轻松地定义好的枚举,而且还可以帮助静态分析器在编译之前为您做一些有趣的检查。
很好的枚举!