枚举值 ,它是一个整形(int) , 并且,它不参与内存的占用和释放,枚举定义变量即可直接使用,不用初始化.
在代码中使用枚举的目的只有一个,那就是增加代码的可读性
enum
是枚举类型,用来定义一系列宏定义常量,相当于一系列的#define xx xx
,第一个值默认从0 开始,其后依次加一, 可以对每一个枚举元素赋值
typedef enum {
messageTypeMe , // = 0 表示自己
messageTypeOther // = 1 表示对方
}messageType;
messgeType type
中 type
的值只有0 和 1, 我们可以通过type
的值来进行控制x的值
int x = type == messageTypeMe ? 100 : 200 ;
枚举的定义还支持位运算的方式定义,如下:
typedef NS_ENUM(NSInteger, Test)
{
TestA = 1, //1 1 1
TestB = 1 << 1, //2 2 10 转换成 10进制 2
TestC = 1 << 2, //4 3 100 转换成 10进制 4
TestD = 1 << 3, //8 4 1000 转换成 10进制 8
TestE = 1 << 4 //16 5 10000 转换成 10进制 16
};
等于号后面必须等于1
什么时候要用到这种方式呢?
那就是一个枚举变量可能要代表多个枚举值的时候. 其实给一个枚举变量赋予多个枚举值的时候,原理只是把各个枚举值加起来罢了.当加起来以后,就获取了一个新的值,那么为了保证这个值的唯一性,这个时候就体现了位运算的重要作用.
位运算可以确保枚举值组合的唯一性
因为位运算的计算方式是将二进制转换成十进制,也就是说,枚举值里面存取的是 计算后的十进制值.打个比方:通过上面的位运算方式设定好枚举以后,打印出来的枚举值分别是: 1 2 4 8 16 这5个数字,无论你如何组合在一起,也不会产生两个同样的数字.
NS_OPTIONS
一般用来定义位运算的枚举值
NS_ENUM
是通用情况,两者本质一样
typedef NS_ENUM(NSInteger,UIButtonType){ };相当于typedef enum { }UIButtonType;
下面是系统文件的两种不同的枚举写法
typedef NS_ENUM(NSInteger, UIButtonType) {
UIButtonTypeCustom = 0, // no button type
UIButtonTypeSystem NS_ENUM_AVAILABLE_IOS(7_0), // standard system button
UIButtonTypeDetailDisclosure,
UIButtonTypeInfoLight,
UIButtonTypeInfoDark,
UIButtonTypeContactAdd,
UIButtonTypeRoundedRect = UIButtonTypeSystem, // Deprecated, use UIButtonTypeSystem instead
};
typedef NS_OPTIONS(NSUInteger, UIControlState) {
UIControlStateNormal = 0,
UIControlStateHighlighted = 1 << 0, // used when UIControl isHighlighted is set
UIControlStateDisabled = 1 << 1,
UIControlStateSelected = 1 << 2, // flag usable by app (see below)
UIControlStateApplication = 0x00FF0000, // additional flags available for application use
UIControlStateReserved = 0xFF000000 // flags reserved for internal framework use
};