当前位置: 移动技术网 > IT编程>移动开发>IOS > 52个有效方法(5) - 用枚举表示状态、选项、状态码

52个有效方法(5) - 用枚举表示状态、选项、状态码

2019年10月15日  | 移动技术网IT编程  | 我要评论

  • 枚举(enum)只是一种常量的命名方式。是c语言中的一种基本数据类型,是一个"被命名的整型常量"的集合。

  • 规范的定义代码中的状态、选项等“常量”。

  • 不参与内存的占用和释放。

  • 在开发中使用枚举的目的,是为了增加代码的可读性。

ns_enumns_options 宏来定义枚举类型,并指明其底层数据类型。

  • ns_enum

    ns_enum一般用来定义默认的枚举值

/* ns_enum supports the use of one or two arguments. the first argument is always the integer type used for the values of the enum. the second argument is an optional type name for the macro. when specifying a type name, you must precede the macro with 'typedef' like so:
 
typedef ns_enum(nsinteger, nscomparisonresult) {
    ...
};
 
if you do not specify a type name, do not use 'typedef'. for example:
 
ns_enum(nsinteger) {
    ...
};
*/
 
#define ns_enum(...) cf_enum(__va_args__)
  • ns_options

    ns_options一般用来定义位移相关操作的枚举值

    #define ns_options(_type, _name) cf_options(_type, _name)

枚举(enum)与状态(states)

某个对象所经历的各种状态可以定义为一个的枚举集(enumeration set)

typedef ns_enum(nsinteger, uiviewanimationtransition) {
    uiviewanimationtransitionnone,
    uiviewanimationtransitionflipfromleft,
    uiviewanimationtransitionflipfromright,
    uiviewanimationtransitioncurlup,
    uiviewanimationtransitioncurldown,
};
  • 编译器会为每个枚举值分配一个独有的编号,从0开始,依次加1

  • 一个字节最多可表示0~255256种(2^8)枚举变量。

枚举(enum)与选项(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
};
  • 选项是用位运算的方式定义的
uiviewautoresizingnone                            0 0 0 0 0 0 0 0
uiviewautoresizingflexibleleftmargin              0 0 0 0 0 0 0 1
uiviewautoresizingflexiblewidth                   0 0 0 0 0 0 1 0
uiviewautoresizingflexiblerightmargin             0 0 0 0 0 1 0 0
uiviewautoresizingflexibletopmargin               0 0 0 0 1 0 0 0
uiviewautoresizingflexibleheight                  0 0 0 1 0 0 0 0
uiviewautoresizingflexiblebottommargin            0 0 1 0 0 0 0 0
uiviewautoresizingflexiblewidth | uiviewautoresizingflexibleheight 
                                                  0 0 0 1 0 0 1 0
  • <<带符号左移 (n<<2 将整型值带符号左移2位 )
    • 将一个运算符对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0

    • 操作数每左移一位,相当于该数乘以2

    • 例如:3<<2 后,结果为12
      3的二进制位11,左移两位后,右边补2个0就是11001100转为10进制为12

    • 左移操作就相当于22次方×3。 每左移1位次方就增1

  • >>带符号右移 (n>>2 将整型值带符号右移2位 )

    • 将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。

    • 操作数每右移一位,相当于该数除以2 ,然后取整

    • 例如:9>>1 后,结果为4
      9的二进制为1001,右移1位后,左正数补0,右边丢弃。结果为 0100。转为10进制后为4

枚举(enum)与状态码(codes)

枚举用法也可用于 switch 语句。在处理枚举类型的switch语句中不要实现default分支。

typedef ns_enum(nsuinteger, eocconnectionstate) {
    eocconnectionstatedisconnected,
    eocconnectionstateconnecting,
    eocconnectionstateconnected
};

switch (_currentstate) {
    eocconnectionstatedisconnected:
      //...
      break;
    eocconnectionstateconnecting:
      //...
      break;
    eocconnectionstateconnected:
      //...
      break;
}

要点

  1. 应该用枚举表示状态机的状态、传递给方法的选项以及状态码等值,给这些值起个易懂的名字,就像监听网络状态的枚举。

  2. 如果把传递给某个方法的选项表示为枚举类型,而多个选项又可同时使用,那么就将各选项定义为2的幂,以便通过按位或操作将其组合起来。

  3. ns_enumns_options 宏来定义枚举类型,并指明其底层数据类型。这样可以确保枚举是用开发者所选的底层数据类型实现出来的,而不会采用编译器所选的类型。

  4. 在处理枚举类型的switch语句中不要实现default分支。这样的话,加入新枚举之后,编译器就会提示开发者:switch语句并未处理所有枚举。

如对本文有疑问, 点击进行留言回复!!

相关文章:

  • ios uicollectionview实现横向滚动

    现在使用卡片效果的app很多,之前公司让实现一种卡片效果,就写了一篇关于实现卡片的文章。文章最后附有demo实现上我选择了使用uicollectionview ... [阅读全文]
  • iOS UICollectionView实现横向滑动

    本文实例为大家分享了ios uicollectionview实现横向滑动的具体代码,供大家参考,具体内容如下uicollectionview的横向滚动,目前我使... [阅读全文]
  • iOS13适配深色模式(Dark Mode)的实现

    iOS13适配深色模式(Dark Mode)的实现

    好像大概也许是一年前, mac os系统发布了深色模式外观, 看着挺刺激, 时至今日用着也还挺爽的终于, 随着iphone11等新手机的发售, ios 13系统... [阅读全文]
  • ios 使用xcode11 新建项目工程的步骤详解

    ios 使用xcode11 新建项目工程的步骤详解

    xcode11新建项目工程,新增了scenedelegate这个类,转而将原appdelegate负责的对ui生命周期的处理担子接了过来。故此可以理解为:ios... [阅读全文]
  • iOS实现转盘效果

    本文实例为大家分享了ios实现转盘效果的具体代码,供大家参考,具体内容如下demo下载地址: ios转盘效果功能:实现了常用的ios转盘效果,轮盘抽奖效果的实现... [阅读全文]
  • iOS开发实现转盘功能

    本文实例为大家分享了ios实现转盘功能的具体代码,供大家参考,具体内容如下今天给同学们讲解一下一个转盘选号的功能,直接上代码直接看viewcontroller#... [阅读全文]
  • iOS实现轮盘动态效果

    本文实例为大家分享了ios实现轮盘动态效果的具体代码,供大家参考,具体内容如下一个常用的绘图,主要用来打分之类的动画,效果如下。主要是ios的绘图和动画,本来想... [阅读全文]
  • iOS实现九宫格连线手势解锁

    本文实例为大家分享了ios实现九宫格连线手势解锁的具体代码,供大家参考,具体内容如下demo下载地址:效果图:核心代码://// clockview.m// 手... [阅读全文]
  • iOS实现卡片堆叠效果

    本文实例为大家分享了ios实现卡片堆叠效果的具体代码,供大家参考,具体内容如下如图,这就是最终效果。去年安卓5.0发布的时候,当我看到安卓全新的material... [阅读全文]
  • iOS利用余弦函数实现卡片浏览工具

    iOS利用余弦函数实现卡片浏览工具

    本文实例为大家分享了ios利用余弦函数实现卡片浏览工具的具体代码,供大家参考,具体内容如下一、实现效果通过拖拽屏幕实现卡片移动,左右两侧的卡片随着拖动变小,中间... [阅读全文]
验证码:
移动技术网