zoukankan      html  css  js  c++  java
  • Objective-C使用位运算设计可复选的枚举

    原文地址: http://my.oschina.net/u/2340880/blog/500870?fromerr=W7C8ZKr6

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

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

            在软件开发中,枚举是我们会经常会用到的一种编程方式,通过枚举,可以使我们的代码更具可读性与统一性。通常情况下,我们会通过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中被广泛使用,能够有效的简化代码和提高代码的可读性。

  • 相关阅读:
    翻转链表二
    最短路径算法
    在二叉树中插入节点
    LightOJ 1341
    串的基本操作
    链队列的基本操作
    LightOJ 1370
    poj 3060 Visible Lattice Points
    欧拉函数介绍及简单模板
    zoj 3593 One Person Game
  • 原文地址:https://www.cnblogs.com/FranZhou/p/5012339.html
Copyright © 2011-2022 走看看