iOS 枚举的巧用

ios-KVO和枚举的简单理解和使用,仅作学习参考.zip 里面功能不用kvo和枚举一样是可以实现的,甚至使用了kvo和枚举反而感觉多此一举, 这仅仅只是作为了解和学习参考,因为想不到啥简单的例子,所以搞一个脱裤子放屁的例子 立即下载

1.使用层面的理解

在这里首先讲如何简单的使用, 仅仅是使用层面(有理解错误的地方帮忙纠正), 然后我们在去理解位运算符! 在下面的图中我们可以看见枚举值中有<<(位运算符:左移):


如果我们在枚举值中看见<<那我们就可以通过|(位运算符:或)进行组合使用如下代码为例:

 //随便添加一个UITextField
 UITextField *field = [UITextField new];
 //Begin,Changed,DidEnd都能触发UITextField的事件
 [field addTarget:self action:@selector(textFieldDidChanged) forControlEvents: UIControlEventEditingDidBegin |
                  UIControlEventValueChanged |
                  UIControlEventEditingDidEnd
     ];

 [self.view addSubview:field];

如下图枚举值中没有<<,这就是普通的NSInteger类型的枚举, 所以不能组合使用:


那苹果官方是怎么知道我们多个条件组合使用了呢? 答案是通过&(位运算符:与)进行判断的:

//controlEvents是组合使用后的一个值
 NSUInteger controlEvents = UIControlEventEditingDidBegin | UIControlEventValueChanged | UIControlEventEditingDidEnd;
    /**
    //通过 & 来判断是否包含:
    UIControlEventEditingDidBegin,
    UIControlEventValueChanged,
    UIControlEventEditingDidEnd
     */
    if (controlEvents & UIControlEventEditingDidBegin) {

        NSLog(@"UIControlEventEditingDidBegin");

    }else if (controlEvents & UIControlEventValueChanged) {

        NSLog(@"UIControlEventValueChanged");

    }else if (controlEvents & UIControlEventEditingDidEnd) {

        NSLog(@"UIControlEventEditingDidEnd");
    }

那么我们接下来看看使用过程中牵扯到的位运算符, 我们会在下面举个例子!

2.理解位运算符

首先我们有一个枚举, 下面代码2种写法我们暂时先不用管,等位运算符讲完我们会讨论枚举的宏使用:

//typedef NS_OPTIONS(NSInteger, myTests) {
//    nameA = 1 << 0,
//    nameB = 1 << 1,
//    nameC = 1 << 2,
//    nameD = 1 << 3,
//};

typedef enum {
    nameA = 1 << 0,
    nameB = 1 << 1,
    nameC = 1 << 2,
    nameD = 1 << 3,

}myTests;

/**
 nameA = 1 << 0 :值为1(2的0次方)
 nameB = 1 << 1 :值为2(2的1次方)
 nameC = 1 << 2 :值为4(2的2次方)
 nameD = 1 << 3 :值为8(2的3次方)
 */

通过&进行判断我们来看看输出结果如下图:


我们得到NSInteger value = nameA | nameB;的组合的值, 判断结果是:1是nameA的值, 2是nameB的值, nameC与nameD没有组合使用所以值为0,最后我们知道如果value & nameC为0说明value不包含nameC 相反则包含!

还有一点就是value & nameA就是nameA的值为1, value & nameB就是nameB的值为2

  • <<(左移):a << b就表示把a转为二进制后左移b位(在后面添b个0)
  • |(或):只要有一个为1, 结果就是1
  • &(与):只要有二个为1, 结果才是1

我们已经知道nameA = 1, nameB = 2, nameC = 4, nameD = 8下面来通过二进制来解释:

 NSInteger value = nameA | nameB | nameC | nameD;
     转成二进制:
     nameA: 0 0 0 1
       |
     nameB: 0 0 1 0
       |
     nameC: 0 1 0 0
       |
     nameD: 1 0 0 0
    ----------------
     value: 1 1 1 1
     上面是使用 | 得出value的值为1111(|的意思是有一个为1结果就为1)


     下面是使用 & 判断输出的值(&的意思就是有二个为1结果才为1)

      value: 1 1 1 1         value: 1 1 1 1
        &                      &
      nameA: 0 0 0 1         nameB: 0 0 1 0
     ----------------       ----------------
      结果值: 0 0 0 1         结果值: 0 0 1 0

      我就写2个例子:0001就是nameA的值, 0010就是nameB的值

相信大家已经明白其中的道理了, 接下来我们来看看枚举的宏, 为了更好阅读也可以看下面的截图:


3.枚举的宏(NS_ENUM与NS_OPTIONS)

NS_ENUM和NS_OPTIONS宏提供了一个简洁、定义枚举和C语言选项的简单方法。

The NS_ENUM and NS_OPTIONS macros provide a concise, simple way of defining enumerations and options in C-based languages. These macros improve code completion in Xcode and explicitly specify the type and size of your enumerations and options. Additionally, this syntax declares enums in a way that is evaluated correctly by older compilers, and by newer ones that can interpret the underlying type information.

这是最初的使用方法:

enum {
        UITableViewCellStyleDefault,
        UITableViewCellStyleValue1,
        UITableViewCellStyleValue2,
        UITableViewCellStyleSubtitle
};
typedef NSInteger UITableViewCellStyle;

--------------------------------------------------

enum {
        UIViewAutoresizingNone                 = 0,
        UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
        UIViewAutoresizingFlexibleWidth        = 1 << 1,
        UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
        UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
        UIViewAutoresizingFlexibleHeight       = 1 << 4,
        UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};
typedef NSUInteger UIViewAutoresizing;

通过使用枚举的宏:

NS_ENUM:是用来声明一般的NSInteger(下面代码使用NSInteger)类型的枚举

Use the NS_ENUM macro to define enumerations, a set of values that are mutually exclusive.

NS_OPTIONS:是用来声明位掩码(bitmasked)

Use the NS_OPTIONS macro to define options, a set of bitmasked values that may be combined together.

//NS_ENUM
typedef NS_ENUM(NSInteger, UITableViewCellStyle) {
        UITableViewCellStyleDefault,
        UITableViewCellStyleValue1,
        UITableViewCellStyleValue2,
        UITableViewCellStyleSubtitle
};

--------------------------------------------------

//NS_OPTIONS
typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
        UIViewAutoresizingNone                 = 0,
        UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
        UIViewAutoresizingFlexibleWidth        = 1 << 1,
        UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
        UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
        UIViewAutoresizingFlexibleHeight       = 1 << 4,
        UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};

NS_OPTIONS 与 NS_ENUM 和 enum 是有什么区别呢?

1.通过上面介绍我们可以看出enum可以声明一般类型和位掩码(bitmasked)类型

2.NS_ENUM声明一般类型, NS_OPTIONS声明掩码(bitmasked)类型

3.那么问题又来了, 直接用enum不就可以了? 答案不是这样的, 苹果建议我们在OC中使用NS_ENUM与NS_OPTIONS, 为什么呢? 因为他们除了推断出不同类型的枚举,再就是当编译Objective-C++模式,它们产生的代码是不同的, 就是因为不同所以混编的时候使用enum会报错!
大家可以看看stackoverflow中的问题解答!不知道我的理解是否有错误, 如果有错误还希望帮忙纠正!



文/判若两人丶(简书作者)
原文链接:http://www.jianshu.com/p/97e582fe89f3
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
iOS开发之枚举用法小结 前言 Enum,也就是枚举,从C语言开始就有了,C++、Java、Objective-C、Swift这些语言,当然都有对应的枚举类型,功能可能有多有少,但是最核心的还是一个—规范的定义代码中的状态、选项等“常量”。 举个例子,我们想要在开发中根据四季的变化做不同的操作,我们首先想到的可能会是定义一个int型变量,通过为该变量赋不同的值来表示四季(e.g. 1为春天,2为夏天,3为秋天,4为冬天).但是,对于阅读该份代码的人来讲,他们并不能在短时间内就明白数字1234所代表的具体含义.这个时候,选择使用枚举则可以应对该需求 C语言中的枚举 在C语言中定义枚举类型的方式如下 enum 枚举名称 立即下载

相关推荐

保姆级教程:用中移ML307模组对接高德/OneOS定位服务,从配置apikey到解析+MLBSLOC状态码

本文详细介绍了如何使用中移ML307系列模组对接高德/OneOS定位服务,从配置apikey到解析+MLBSLOC状态码的全过程。涵盖高德定位服务和OneOS定位服务的配置步骤、常见错误处理及性能优化技巧,帮助开发者快速实现基站定位功能,提升物联网项目的定位精度和稳定性。

weixin_30632089的博客 505

IOS中Object语法的枚举深入理解

--------------------------------- 核心部分 ---------------------------------------------------------这段代码最后的分析就是,为啥typedef对枚举类型UIControlState : NSUInteger的"别名"定义前置了,这个从语法上面没有问题么?如上我们针对于枚举进行了一些常识的复习,对于匿名枚举也有了认识。我们做一个示例,定义一个枚举名称为Test,拥有TestA、TestB等枚举成员的枚举类型。

freeandperson的专栏 1114

Starlink地面终端天线对星(一)对星流程,星历下载,信标信号

starlink卫星终端对星采用机械伺服+相控阵电子扫描的混合模式,兼顾快速盲扫和高精度跟踪;对星流程分三步:冷启动与盲捕获 → 建立初始链路并下载星历 → 进入正常通信模式;

chen2jiang3的博客 2722

iOS---枚举

一.枚举的几种写法1.第一种写法typedef enum{    XMGDemoTypeTop,    XMGDemoTypeBottom,}XMGDemoType;2.第二种枚举,定义类型typedef NS_ENUM(NSInteger,XMGType){    XMGTypeTop,    XMGTypeBottom,};3.第三种枚举 ,位移枚举//一个参数可以传递多个值 ,如果枚举使用了...

iotjin的专栏 1208

机器学习---xgboost算法

问题上表现的十分顶尖,本节将较详细的介绍XGBoost的算法原理。成和剪枝分别对应了经验风险最小化和结构风险最小化, XGBoost的决策树生成是结构风险最小。式(1.1)称为经验风险最小化,训练得到的模型复杂度较高。出结果, 是模型的输出结果;等式右边第⼀部分是模型的训练误差,第⼆部分是正则化项,这里。其中,F是假设空间,假设空间是在已知属性和属性可能取值的情况下,对所有可能满足目标的情。最小化,结构风险最小化的模型往往对训练数据以及未知的测试数据都有较好的预测。的正则化项是K棵树的正则化项相加而来的。

weixin_43961909的博客 1万+

脑电分析中的频谱特征提取 —— 从理论到实践

本文系统介绍了脑电信号(EEG)频谱特征提取方法及其应用。EEG信号通过频谱分析可分为Delta、Theta、Alpha、Beta和Gamma等具有明确生理意义的频段。文章详细讲解了功率谱密度、频带功率、相对功率、频谱熵等关键特征的计算方法,并提供了Python实现示例,包括模拟数据和真实CHB-MIT癫痫数据集的处理流程。这些频谱特征在脑机接口、情绪识别、疲劳监测和癫痫检测等领域具有重要应用价值。文章强调频谱特征结合时域和非线性特征可提升分析效果,为EEG研究提供了实用指导。

qq_32516809的博客 1441

ios学习

在iOS开发中,响应链(Responder Chain)是一种用于处理事件传递和响应的机制。每个iOS应用程序都有一个由多个响应者对象(Responder)组成的响应链,包括窗口、视图控制器、视图等。事件传递和响应是基于以下两个概念的:响应者(Responder):一个响应者是一个继承自类的对象,它可以接收并处理事件。常见的响应者包括UIWindow和UIView等。

a58gg的博客 579

VCU128开发板上手记:搞定100G以太网IP核与QSFP光模块的那些坑

本文详细介绍了在VCU128开发板上实现100G以太网IP核与QSFP光模块调试的实战经验。从硬件准备、IP核配置到QSFP模块控制信号处理,文章揭示了数据手册中未提及的关键细节,并提供了优化参数和压力测试方案,帮助开发者快速解决UltraScale+平台下的高速以太网部署难题。

weixin_30740295的博客 520

iOS之常用的枚举

枚举 枚举相信大家都不陌生,其分类有几种 普通枚举 typedef enum {}枚举名称 typedef enum { ProductTypehaiyun = 1, ProductTypeAir = 2 }ProductType; 定义类型的枚举 -typedef NS_ENUM(NSInteger,名称){} //定义类型 typedef NS_ENUM(N...

chase的博客 1581

软件工程实验报告--用Visio绘制数据流图、ER图、状态图、软件结构图、程序流程图、系统流程图

用Visio绘制数据流图、ER图、状态图、软件结构图、程序流程图、系统流程图

m0_73814332的博客 4161

【教程4>第5章>第19节】基于Gardner环的位同步系统MATLAB仿真与带时偏基带数据导出

由于在FPGA中,时偏的影响主要是由系统收发两端晶振的不同步带来的,所以在仿真测试阶段,很难直接通过FPGA来模拟这个因素,所以我们采用MATLAB模拟带时偏的基带输入信号,并将其导出,由FPGA调用作为测试信号源。可以看到,同步之后(图3)相对于带时偏的基带信号(图2),其更接近标准的数据(图1),且抖动较小。订阅过的朋友可以复习下这个课程,没有订阅的朋友,也可以直接复制如下的程序进行仿真测试。上述程序中,加入时偏的基带信号,通过子函数。同步之后,可以恢复出标准的QPSK星座图。

FPGA/MATLAB学习教程/源码/项目合作开发 520

IOS 枚举 enum

前言:oc中枚举的正确使用,可以增强代码的可读性,减少各种“错误”,让代码更加的规范。下面先介绍枚举的用法,最后介绍个人对枚举的理解,什么是枚举,为什么用枚举。 一. OC中,枚举的使用 1. 写法1格式:关键字 enum 枚举名字{枚举成员,枚举成员2}; 1 /* 2 * 枚举 可以写在@interface 里面 3 **/ 4 enum Test{ 5 test...

weixin_30446197的博客 297

农业无人机:无人机图像处理_(8).遥感图像处理与分析

遥感图像处理与分析在农业无人机技术中具有重要作用,通过图像预处理、特征提取、分类与分割、目标检测等技术,可以实现对农田的精细管理、作物监测、病虫害预测等应用。本节详细介绍了这些技术的基本概念、常用方法和具体实现,希望对您在农业无人机图像处理方面的学习和应用有所帮助。

zhubeibei168的博客 1335

iOS 枚举的使用

枚举在iOS中会经常用到,我们举一个简单的例子来讲一下如何创建枚举,如何使用 首先,启动Xcode 创建一个项目 起名 TestMJ 在创建好的项目中新建一个头文件 起名 TypeTest 我们在TypeTest.h中创建一个枚举 typedef enum { TEST1=0, TEST2, TEST3 }TypeTest; 然后 我们在需要使用

2512

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

iOS Dev (46) iOS 的枚举

iOS Dev (46) iOS 的枚举 作者:大锐哥博客:http://prevention.iteye.com 不就是 C 吗? 是的,就是 C,所以你用 C 的枚举定义方式是 OK 带。如下: typedef enum { TypeA = 0, TypeB, TypeC, TypeD } MyType; MyType 是枚举类型的名称。它的可能

大锐哥的技术专栏 2906

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

iOS-位移枚举

枚举&位移枚举 之前,我们一般都采用C语言的方式定义枚举,这种枚举可以称为普通的枚举。 typedef enum{ DirectionTypeUp, DirectionTypeLeft, DirectionTypeDown, DirectionTypeRight } DirectionType; 但是我们在查看苹果的SDK或者看一些第三方库时会

每天进步一点点 3575

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

iOS枚举的运用

1.什么是枚举? 枚举其实就是一个整型常数的集合,最简单的例子就是表示星期的SUN, MON, TUE, WED, THU, FRI,SAT, 就是一个枚举。 2.iOS中枚举的使用    在ObjC中可以使用C语言的方式进行枚举,其实ObjC的枚举就是在C语言上演化而来,先了解C语言定义一个枚举的方式有助于我们对枚举的理解。        下面我们定义一个枚举类型Animal,形式为

qq546542233的博客 378

iOS设置NSString的枚举

typedef NS_ENUM(NSInteger, ORDERSTATE) { ORDERSTATE_NoStart = 1, //未开始 ORDERSTATE_StartGrab, //抢单 ORDERSTATE_HasGrabBySelf, //自己抢到 ORDERSTATE_HasGra

iOS开发之路 1万+

iOS:枚举和位运算

今天对iOS的枚举和位运算做一下整理,主要内容如下: 1.iOS中的两个枚举类型:NS_OPTIONS,NS_ENUM 2.枚举使用位运算的原因 3.位运算介绍和扩展 一.枚举类型 一般情况下,我们采用C风格的enum关键字可以定义枚举类型。 enum{ UIViewAnimationTransitionNone, UIViewAn

zhichayibu2012的专栏 4683
上一篇: Xcode8 兼容iOS 10 整理笔记
下一篇: 让你的 Xcode8 继续使用插件
TY_IOS
博客等级 码龄11年 16粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值