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

简介: 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];

打印结果如下:

image.png



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


 

目录
相关文章
|
JSON 开发工具 iOS开发
Objective-C使用位运算设计可复选的枚举
 在软件开发中,枚举是我们会经常会用到的一种编程方式,通过枚举,可以使我们的代码更具可读性与统一性。通常情况下,我们会通过typedef来定义一种枚举的类型来使用
171 0
|
iOS开发
精通Objective-C系列 - 2) 使用结构和枚举
#import // -------------------------------------------------- // constants for the different kinds of shapes and their colors typedef enum {...
794 0
|
4月前
|
安全 编译器 Swift
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
100 2
|
3天前
|
算法 编译器 Swift
【Swift开发专栏】Swift与Objective-C的对比
【4月更文挑战第30天】Swift与Objective-C对比:Swift语法简洁,支持元组、泛型和闭包,提高可读性;性能优化,使用LLVM编译器,与Objective-C兼容,便于迁移项目;生态系统活跃,苹果官方支持,丰富资源库。Objective-C虽历史悠久,但逐渐边缘化。对于新项目和开发者,Swift是更佳选择,驱动iOS开发创新。
|
4月前
|
安全 JavaScript 前端开发
IOS开发基础知识:介绍一下 Swift 和 Objective-C,它们之间有什么区别?
IOS开发基础知识:介绍一下 Swift 和 Objective-C,它们之间有什么区别?
69 0
|
机器学习/深度学习 API iOS开发
【IOS 开发】Objective-C Foundation 框架 -- 字符串 | 日期 | 对象复制 | NSArray | NSSet | NSDictionary | 谓词(一)
【IOS 开发】Objective-C Foundation 框架 -- 字符串 | 日期 | 对象复制 | NSArray | NSSet | NSDictionary | 谓词(一)
141 0
|
存储 自然语言处理 Java
【IOS 开发】Objective-C Foundation 框架 -- 字符串 | 日期 | 对象复制 | NSArray | NSSet | NSDictionary | 谓词(二)
【IOS 开发】Objective-C Foundation 框架 -- 字符串 | 日期 | 对象复制 | NSArray | NSSet | NSDictionary | 谓词(二)
218 0
|
Java iOS开发
【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态(二)
【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态(二)
116 0