iOS 关于枚举的使用

引言:

枚举 它是一个整形(int)  并且,它不参与内存的占用和释放,枚举定义变量即可直接使用,不用初始化.

在代码中使用枚举的目的只有一个,那就是增加代码的可读性.

使用:

枚举的定义如下:

typedef enum
{
    //以下是枚举成员
    TestA = 0,
    TestB,
    TestC,
    TestD
}Test;//枚举名称

亦可以如下定义(推荐:结构比较清晰):

typedef NS_ENUM(NSInteger, Test1)
{
    //以下是枚举成员
    Test1A = 0,
    Test1B = 1,
    Test1C = 2,
    Test1D = 3
};

枚举的定义还支持位运算的方式定义,如下:

等于号后面必须等于1

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 2 4 8 16

这5个数字,无论你如何组合在一起,也不会产生两个同样的数字.

手工的去创建位运算枚举,还有稍微有点花时间的,好在Apple已经为我们准备的uint.所以,用下面这种方式来初始化一个位运算枚举吧:

typedef NS_ENUM(uint, Test)
{
    TestA,
    TestB,
    TestC,
    TestD,
    TestE
};

多枚举值 赋值方式如下:

Test tes = (TestA|TestB);

判断枚举变量是否包含某个固定的枚举值,使用前需要确保枚举值以及各个组合的唯一性:

NSLog(@"%d %d %d %d %d",TestA,TestB,TestC,TestD,TestE);
Test tes = (TestA|TestB);
NSLog(@"%d",tes);
NSLog(@"%d",(tes & TestA));

if ((tes & TestA)) {
    NSLog(@"有");
}else
{
    NSLog(@"没有");
}
NSLog(@"%d",(tes & TestB));
if ((tes & TestA)) {
    NSLog(@"有");
}else
{
    NSLog(@"没有");
}

NSLog(@"%d",(tes & TestC));
if ((tes & TestC)) {
    NSLog(@"有");
}else
{
    NSLog(@"没有");
}

如果 没有包含,将返回0, 0表示false NO 则进入else

也可以随时为枚举变量累加某个值,但是要自己控制不要添加已经加入过的枚举值, 枚举变量的值不会有变动,但这样将会误导阅读代码的人

tes |=TestC;

有累加,自然有累减了,如果累减不存在的枚举值, 那么本次累减的枚举值,会自动累加上去.

tes^= TestE;

以上,差不多就介绍完了, 如果有什么疑问,欢迎提问.

时间: 2024-08-20 05:13:39

iOS 关于枚举的使用的相关文章

iOS 位枚举

在 iOS 开发中,我们使用系统的枚举定义的时候,经常可以看到位枚举: typedef NS_OPTIONS(NSUInteger, UIControlState) { UIControlStateNormal = 0, UIControlStateHighlighted = 1 << 0, // used when UIControl isHighlighted is set UIControlStateDisabled = 1 << 1, UIControlStateSelec

iOS开发之枚举用法小结_IOS

前言 Enum,也就是枚举,从C语言开始就有了,C++.Java.Objective-C.Swift这些语言,当然都有对应的枚举类型,功能可能有多有少,但是最核心的还是一个-规范的定义代码中的状态.选项等"常量". 举个例子,我们想要在开发中根据四季的变化做不同的操作,我们首先想到的可能会是定义一个int型变量,通过为该变量赋不同的值来表示四季(e.g. 1为春天,2为夏天,3为秋天,4为冬天).但是,对于阅读该份代码的人来讲,他们并不能在短时间内就明白数字1234所代表的具体含义.这

iOS - Swift Enum 枚举

前言 枚举声明的类型是囊括可能状态的有限集,且可以具有附加值.通过内嵌(nesting),方法(method),关联值(associated values) 和模式匹配(pattern matching) 枚举可以分层次地定义任何有组织的数据. 和 switch 语句类似,Swift 中的枚举乍看之下更像是 C 语言中枚举的进阶版本,即允许你定义一种类型,用于表示普通事情中某种用例.不过深入挖掘之后,凭借 Swift 背后特别的设计理念,相比较 C 语言枚举来说其在实际场景中的应用更为广泛.特别

iOS - OC Enum 枚举

前言 iOS 5.0 之后,提供了新的枚举定义方式,定义枚举的同时,可以指定枚举中数据的类型. typedef NS_OPTIONS(_type, _name) new; -> 位移的,可以使用 按位或 设置数值 typedef NS_ENUM(_type, _name) new; -> 数字的,直接使用枚举设置数值 位移型枚举: 使用 按位或 可以给一个参数同时设置多个 "类型".在具体执行的时候,使用 按位与 可以判断具体的 "类型". OC 中 6

ios中的枚举类型 ios6+

在iOS6和Mac OS 10.8以后Apple引入了两个宏来重新定义这两个枚举类型,实际上是将enum定义和typedef合二为一,并且采用不同的宏来从代码角度来区分. NS_OPTIONS一般用来定义位移相关操作的枚举值,我们可以参考UIKit.Framework的头文件,可以看到大量的枚举定义.     typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {           UIViewAnimationTransitionNon

iOS开发中 常用枚举和常用的一些运算符(易错总结)

1.色值的随机值: #define kColorValue arc4random_uniform(256)/255.0 // arc4random_uniform(256)/255.0; 求出0.0~1.0之间的数字 view.backgroundColor = [UIColor colorWithRed:kColorValue green: kColorValue blue: kColorValue alpha: 0.5]; 2.定时器的使用: [NSTimer scheduledTimerW

ios入门OC_UI晋级学什么?

1. OC 语法初步, 你可能学到面向对象最近本的概念, 并且可以大致的建立几个自以为是的类,但这仅仅是开始. 你知道为什么面向对象要有3大特性么.知道他们是用到什么设计模式的么 2. 你可能学到了NSString, NSMutableString 字符串的基本操作方法, 你可能会花大量的时间去看那些方法. 从没考虑过方法的实用性. UI方法成千上万, 大量的时间浪费到寻找上边可能会很累的. 所以, 学会现用现看 3. 你可能学到了NSArray, NSMutableArray, NSDicti

iOS UITableView代理方法详解

IOS UITableView的代理方法详解 一.补充 在上一篇博客中,http://my.oschina.net/u/2340880/blog/404605,我将IOS中tableView(表视图)的一些常用方法总结了一下,这篇将tableView的代理方法作了总结,对上一篇博客进行了补充. 二.UITableViewDataSourc(数据源代理) 1.必须实现的回调方法 返回每个分区的行数 - (NSInteger)tableView:(UITableView *)tableView nu

iOS界面布局之三——纯代码的autoLayout及布局动画

iOS界面布局之三--纯代码的autoLayout及布局动画 一.引言         关于界面布局,apple的策略已经趋于成熟,autolayout的优势在开发中也已经展现的淋漓尽致.除了使用storyBoard进行布局约束的拖拽,有时我们也需要在代码中进行autolayout的布局设置,Masonry库可以方便的创建约束属性,实际上,我们也没有必要再使用系统原生的代码来创建和设置约束,这篇博客只作为使用的方法备忘.前几篇布局介绍的链接如下: 使用autoresizing进行界面布局:htt