文档章节

Objective-C使用位运算设计可复选的枚举

法斗斗
 法斗斗
发布于 2016/05/20 11:25
字数 687
阅读 12
收藏 0

Objective-C使用位运算设计可复选的枚举

 

使用位运算设计可复选的枚举

一、枚举使用的一个小例子

        在软件开发中,枚举是我们会经常会用到的一种编程方式,通过枚举,可以使我们的代码更具可读性与统一性。通常情况下,我们会通过typedef来定义一种枚举的类型来使用。例如:

typedef enum {
    para1,
    para2,
    para3
}myEnum;

我们可以在函数的参数中来使用它:

-(void)testEunm:(myEnum)para{
    switch (para) {
        case para1:
        {
            NSLog(@"para%d",1);
        }
            break;
        case para2:
        {
             NSLog(@"para%d",2);
        }
            break;
        case para3:
        {
             NSLog(@"para%d",3);
        }
            break;
        default:
            break;
    }
}

我们在调用调用这样的一个函数的时候,通过传入一个枚举类型,可以分流执行我们想要的操作。

二、枚举到底是个什么东西

        枚举并不是一种奇怪的类型,起实质是整型的另一个名字,如果没有附加的操作,枚举中的第一个参数默认就是整型0,之后依次递加,当然,我们也可以认为的控制这个数值,例如:

typedef enum {
    para1=7,
    para2,
    para3=1000
}myEnum;

可以这么理解,我在传参的时候,传7和para1是完全一样的效果,但是后者明显更具可读性。

三、可复选的枚举属性

        如果熟悉iOS的开发,你会发现系统很多的枚举类型都是可以复选的,例如视图的拉伸模式,json的解析属性等等,这不仅使代码可读性优化,也更加简便了一些选项设置的代码。当我们理解了枚举就是整型之后,会发现其实很容易做到这一点:

首先,我们给定义的枚举参数设置一个有规律的值:

typedef enum {
    para1=1<<1,
    para2=1<<2,
    para3=1<<3
}myEnum;

<<符号是位运算中的左移运算符,将1进行1位,2位,3位的左移后,我们得到的二进制数如下:

0001
0010
0100

现在我们有了一个大致思路了,用当前位的0和1来标识当前属性是否设置,如果有几个属性的复选,只需要将我们的相应枚举进行或的位运算,在取的时候检测相应位是否为1即可,这正是与运算可以做到的:

-(void)testEunm:(myEnum)para{
    if (para&1<<1) {
        NSLog(@"para1");
    }
    if (para&1<<2) {
        NSLog(@"para2");
    }
    if (para&1<<3) {
        NSLog(@"para3");
    }
}

我们通过如下方式调用:

[self testEunm:para2|para3];

打印结果如下:

这种位运算的枚举在官方sdk中被广泛使用,能够有效的简化代码和提高代码的可读性。

本文转载自:

共有 人打赏支持
法斗斗
粉丝 22
博文 367
码字总数 17774
作品 0
杨浦
程序员
私信 提问

暂无文章

乱入Linux界的我是如何学习的

欢迎来到建哥学Linux,咳!咳!咳!开个玩笑哈,我是一个IT男,IT界的入门选手,正在学习Linux。 在之前,一直想进军IT界,学习IT技术,但是苦于没有人指导,也不知道学什么,最开始我自己在...

linuxCool
29分钟前
0
0
携程Apollo统一配置中心的搭建和使用(java)

一.Apollo配置中心介绍 1、What is Apollo 1.1 Apollo简介 Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到...

morpheusWB
49分钟前
1
0
远程获得的有趣的linux命令

使用这些工具从远程了解天气、阅读资料等。 我们即将结束为期 24 天的 Linux 命令行玩具日历。希望你有一直在看,如果没有,请回到开始,从头看过来。你会发现 Linux 终端有很多游戏、消遣和...

Linux就该这么学
今天
6
0
聊聊flink的AsyncWaitOperator

序 本文主要研究一下flink的AsyncWaitOperator AsyncWaitOperator flink-streaming-java_2.11-1.7.0-sources.jar!/org/apache/flink/streaming/api/operators/async/AsyncWaitOperator.java ......

go4it
今天
5
0
Java并发编程基础(四)

ThreadGroup 在主线程创建得线程,如果没有给他指定线程组,那么创建的线程,默认和主线程同一个线程组。线程组可以底下可以是线程,也可以实线程组。 构建线程组的方法: private ThreadGr...

chendom
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部