枚举类型

真理惟一可靠的标准就是永远自相符合。

枚举的作用和定义

枚举的作用在于规范并语义化的定义代码中的状态、选项等常量。如果一个变量只有几种可能的值,比如屏幕支持的方向只有上(Orientation Portrait)、下(Orientation Upside down)、左(Orientation Landscape Left)、右(Orientation Landscape Right)。就可以使用枚举类型来定义一个代表方向枚举类型变量。

枚举类型的定义以关键字enum开头,之后是枚举数据类型的名称,最后是在一对花括号内的选项标识符序列。 (实现枚举所用的数据类型取决于编译器。除了使用默认类型,还可以指明用何种“底层数据类型”来保存枚举类型的变量):

//使用编译器默认类型
enum Orientation {
        Orientation_Portrait,
        Orientation_Down,
        Orientation_left,
        Orientation_Right
    };
//指明枚举类型保存变量的类型
enum Orientation: NSUInteger {
        Orientation_Portrait,
        Orientation_Down,
        Orientation_left,
        Orientation_Right
    };
//定义匿名枚举类型,并定义两个枚举变量
enum {
        Orientation_Portrait,
        Orientation_Down,
        Orientation_left,
        Orientation_Right
    } WX_Orientation,QQ_Orientation;

枚举类型值的分配原则:
编译器会为枚举分配一个独有的编号(枚举变量的本质就是无符号整数(%u占位符)),从0开始,每个枚举递增1。(可以手动指定某个枚举成员所对应的值,接下来的枚举值会在上一个的基础上递增1)。

使用关键字typedef重新定义枚举,目的是为了简化枚举的声明,不需要每次都写enum

enum Orientation: NSUInteger {
        Orientation_Portrait,
        Orientation_Down,
        Orientation_left,
        Orientation_Right
    }; 
typedef enum Orientation Orientation;
//使用Orientation代替完整的enum Orientation来声明两个枚举变量
Orientation ori_1, ori_2;

合并后

typedef enum Orientation: NSUInteger {
    Orientation_Portrait,
    Orientation_Down,
    Orientation_left,
    Orientation_Right
} Orientation;
基本使用方法

//定义枚举
typedef enum Orientation: NSUInteger {
    Orientation_Portrait,
    Orientation_Down,
    Orientation_left,
    Orientation_Right
} Orientation;
//创建枚举变量并赋值
Orientation QQ_Orientation = Orientation_Portrait;

//调用函数
 [self defineQQOrientation:QQ_Orientation];

- (void)defineQQOrientation:(Orientation)orientation{
    switch (orientation) {
        case Orientation_Portrait:
            break;
        case Orientation_Down:
            break;
        case Orientation_left:
            break;
        case Orientation_Right:
            break;
            
        default:
            break;
    }
}

枚举的另一种使用方式是定义为按位掩码,当定义选项的时候,若这些选项可以彼此组合,则在设置特定的枚举值后,各选项间就可通过“按位或”来组合。因为每个枚举值所对应的二进制表示中,只有1个二进制位的值是1,所以多个选项“按位或”后的组合值是唯一的,且将某一选项与组合值做“按位与”操作,即可判断出组合值中是否包含该选项。

enum Orientation {
        Orientation_Portrait = 1 << 0, // 0001
        Orientation_Down = 1 << 1,// 0010
        Orientation_left = 1 << 2,// 0100
        Orientation_Right = 1 << 3// 1000
    };

多选项使用方法:

typedef enum OrientationGroup {
    OrientationGroup_Portrait = 1 << 0, // 0001,
    OrientationGroup_Down = 1 << 1, // 0010,
    OrientationGroup_left = 1 << 2, // 0100,
    OrientationGroup_Right = 1 << 3, // 1000
} OrientationGroup;

//用“或”运算同时赋值多个选项
OrientationGroup orientationGroup = OrientationGroup_left | OrientationGroup_Down;
    
//用“与”运算取出对应位
if (orientationGroup & OrientationGroup_Portrait) {
    NSLog(@"OrientationGroup_Portrait OK");
}
    
if (orientationGroup & OrientationGroup_left) {
    NSLog(@"OrientationGroup_left OK");
}
    
if (orientationGroup & OrientationGroup_Right) {
    NSLog(@"OrientationGroup_Right OK");
}
    
if (orientationGroup & OrientationGroup_Down) {
    NSLog(@"OrientationGroup_Down OK");
}

运行结果:

2019-09-19 14:17:52.610619+0800 Text[2143:121039] OrientationGroup_left OK
2019-09-19 14:17:52.610763+0800 Text[2143:121039] OrientationGroup_Down OK
enum在Objective-C中的“升级版”

从C++ 11开始,我们可以为枚举指定其实际的存储类型,在枚举的定义中已经提到过,如下

//指明枚举类型保存变量的类型
enum Orientation: NSUInteger {
        Orientation_Portrait,
        Orientation_Down,
        Orientation_left,
        Orientation_Right
    };

在Objective-C中为了保证枚举类型的兼容性,推荐使用NS_ENUM和NS_OPTIONS

// NS_ENUM,定义状态等普通枚举类型
typedef NS_ENUM(NSInteger, NS_Orientation) {
    NS_Orientation_Portrait,
    NS_Orientation_Down,
    NS_Orientation_left,
    NS_Orientation_Right
};
// NS_OPTIONS,定义可组合选项的枚举类型
typedef NS_OPTIONS(NSInteger, OP_Orientation) {
    OP_Orientation_None = 0,
    OP_Orientation_Portrait = 1 << 0,
    OP_Orientation_Down = 1 << 1,
    OP_Orientation_left = 1 << 2,
    OP_Orientation_Right = 1 << 3
};
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • 一、枚举类型枚举类型也成为枚举,它是一种创建数值类型的机制,这种值类型的可能取值是预定义的,而对于其中的每个可能取...
    CarlDonitz阅读 954评论 0 1
  • 本文摘自http://blog.csdn.net/skyflying2012/article/details/22...
    鹰击司马阅读 1,050评论 0 0
  • 枚举类型的目的 1.枚举类型使代码更具可读性,理解清晰,易于维护 2.如果枚举符号和对应的整数值发生变化,只需修改...
    petit_prince阅读 618评论 0 0
  • 最近在外面实习,发现公司代码很多地方都用到了枚举类型,而以前很少有机会能用到它,所以特地深入地学习一下Java中的...
    Cheysen阅读 702评论 0 0
  • 我以前从来不知道什么叫做人前显贵人后受罪,我一直以来都认为我自己是在人前受罪人后也受罪,以前的我一直都在抱怨,抱怨...
    榆木清清阅读 1,413评论 1 4