我不认为我从根本上理解枚举是什么,以及什么时候使用它。

例如:

typedef enum {
    kCircle,
    kRectangle,
    kOblateSpheroid
} ShapeType;

这里真正声明的是什么?


当前回答

类型定义是C和c++中的关键字。它用于为基本数据类型(char, int, float, double, struct & enum)创建新名称。

typedef enum {
    kCircle,
    kRectangle,
    kOblateSpheroid
} ShapeType;

这里它创建枚举数据类型ShapeType &我们可以为枚举类型ShapeType写新的名称,如下所示

ShapeType shape1; 
ShapeType shape2; 
ShapeType shape3;

其他回答

用户定义的类型,其值可能为kCircle、kRectangle或koblabespheroid。但是,枚举内部的值(kCircle等)在枚举外部是可见的。记住这一点很重要(int i = kCircle;例如,有效的)。

从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”视频。


更新 官方文件的链接在这里。

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
    }

枚举声明了一组有序值——typedef只是给它加了一个方便的名字。第一个元素是0等等。

typedef enum {
Monday=1,
...
} WORKDAYS;

WORKDAYS today = Monday;

上面只是shapeType标记的枚举。

枚举可以减少许多类型的“错误”,并使代码更易于管理

#define STATE_GOOD 0
#define STATE_BAD 1
#define STATE_OTHER 2
int STATE = STATE_OTHER

这个定义没有约束。这只是一个简单的代换。 它不能限制国家的所有条件。当STATE被赋值为5时,程序将出错,因为没有匹配的状态。但是编译器不会警告STATE = 5

所以这样用比较好

typedef enum SampleState {
    SampleStateGood  = 0,
    SampleStateBad,
    SampleStateOther
} SampleState;

SampleState state = SampleStateGood;