5分钟学会枚举的正确使用姿势-Enumeration宏
来源:互联网 发布:淘宝修改密码弹回登陆 编辑:程序博客网 时间:2024/04/28 15:44
原文链接
前言
Enum,枚举,相信大部分编程语言都有对应的枚举类型,功能可能有多有少,但是枚举最核心的功能是 “规范的定义代码中的状态、状态码、选项”。
状态、状态码、选项
什么是状态:同时只能出现一个值(状态码就是他的值),比如这个ScrollView里的枚举:
typedef NS_ENUM(NSInteger, UIScrollViewKeyboardDismissMode) { UIScrollViewKeyboardDismissModeNone, UIScrollViewKeyboardDismissModeOnDrag, UIScrollViewKeyboardDismissModeInteractive};
什么是选项:同时可以出现一个或多个值:
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_ENUM(状态) 和 NS_OPTIONS(选项)?
- 苹果推荐。
- 大家都这样写。
- 其他的不好学。
- 以上的都不重要,看我的证明就行了。
状态的表示姿势
错误姿势
#define UIScrollViewKeyboardDismissModeNone 0#define UIScrollViewKeyboardDismissModeOnDrag 1 #define UIScrollViewKeyboardDismissModeInteractive 2// 接收值就得这样:int UIScrollViewKeyboardDismissMode = UIScrollViewKeyboardDismissModeNone;
为什么这样做不好:
- 宏定义没有类型约束,只是单纯的替换。
- 可读性较差。
- 可以用int也可以用UIInteger来接收。
正确姿势
typedef enum { UIScrollViewKeyboardDismissModeNone = 0, UIScrollViewKeyboardDismissModeOnDrag, UIScrollViewKeyboardDismissModeInteractive} UIScrollViewKeyboardDismissMode;// 指明枚举类型UIScrollViewKeyboardDismissMode mode = UIScrollViewKeyboardDismissModeNone;
用起来就是这样的:
- (void)dealWithMode:(UIScrollViewKeyboardDismissMode)mode { switch (mode) { case UIScrollViewKeyboardDismissModeNone: //... break; case UIScrollViewKeyboardDismissModeOnDrag: //... break; case UIScrollViewKeyboardDismissModeInteractive: //... break; }}
这样枚举解决了上面1和2的缺点,但是第3点还是没有解决,我依然可以这样搞:
int mode = UIScrollViewKeyboardDismissModeNone;// orUIInteger mode = UIScrollViewKeyboardDismissModeNone;
完美姿势
NS_ENUM是枚举在Objective-C中的”升级版”,改进后代码如下:
typedef NS_ENUM(NSInteger, UIScrollViewKeyboardDismissMode) { UIScrollViewKeyboardDismissModeNone, UIScrollViewKeyboardDismissModeOnDrag, UIScrollViewKeyboardDismissModeInteractive};
代码很简单,不理解的话可以评论求解答。
选项的使用姿势
如果有一个”选项变量”要同时表示一个或者多个值肿么办?这时就得上我们的NS_OPTIONS了。
比如有这样一个简单的例子:
typedef NS_OPTIONS(NSUInteger, JZZPersonType) { JZZPersonTypeHigh = 0, JZZPersonTypeRich = 1 << 0, JZZPersonTypePretty = 1 << 1};
可以看到,我们这里的选项是用的位运算的方式定义的,这样的好处就是我们的选项变量可以这样来表示:
// 用“或|”运算同时赋值多个选项JZZPersonType personType = JZZPersonTypeHigh | JZZPersonTypeRich | JZZPersonTypePretty;// 用“与&”运算取出对应位if (personType & JZZPersonTypeHigh) { NSLog(@"高");}if (personType & JZZPersonTypeRich) { NSLog(@"富");}if (personType & JZZPersonTypePretty) { NSLog(@"帅");}
“|”赋值完后,富帅的内心(内存)其实是长这样的:
写在结尾
富帅点个赞呗。
Done
作者 @biggergao
2016年05月22日
0 0
- 5分钟学会枚举的正确使用姿势-Enumeration宏
- 枚举使用的正确姿势
- 3分钟学会用导入表格数据到云端的正确姿势~
- 枚举类Enumeration的使用
- Fragment使用的正确姿势
- git 的正确使用姿势
- 使用libcurl的正确姿势
- datasheet 使用的正确姿势
- layout_weight的正确使用姿势
- ActivityLifecycleCallbacks的正确使用姿势
- SharedPreference使用的正确姿势
- 使用layoutinflater的正确姿势
- WWW的正确使用姿势
- 使用layoutinflater的正确姿势
- MongoDB的正确使用姿势
- 使用SQLiteOpenHelper的正确姿势
- 动画的正确使用姿势
- FragmentTabHost的正确使用姿势
- PHP程序员的能力水平层次
- nod-1639-绑鞋带
- android中的动画
- 玩转树莓派-1-配置篇
- 通过传址来传递和返回对象
- 5分钟学会枚举的正确使用姿势-Enumeration宏
- 输出字符串中最长的单词
- Spark Streaming 1.3对Kafka整合的提升详解
- 记一次I2S调试经历
- C#与闭包
- 程序员修养录:从入门修炼到高手四阶段<学习金字塔理论>
- 习题8-4 UVA - 11491 Erasing and Winning 奖品的价值(滑动窗口)
- c++上机实验6项目三
- 如何给GridView添加分割线