iOS-----5分钟学会枚举的正确使用姿势-Enumeration宏
前言
Enum,枚举,相信大部分编程语言都有对应的枚举类型,功能可能有多有少,但是枚举最核心的功能是 “规范的定义代码中的状态、状态码、选项”。
状态、状态码、选项
什么是状态:同时只能出现一个值(状态码就是他的值),比如这个ScrollView里的枚举:
1
2
3
4
5
|
typedef NS_ENUM(NSInteger, UIScrollViewKeyboardDismissMode) {
UIScrollViewKeyboardDismissModeNone,
UIScrollViewKeyboardDismissModeOnDrag,
UIScrollViewKeyboardDismissModeInteractive
};
|
什么是选项:同时可以出现一个或多个值:
1
2
3
4
5
6
7
8
9
|
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(选项)?
- 苹果推荐。
- 大家都这样写。
- 其他的不好学。
- 以上的都不重要,看我的证明就行了。
状态的表示姿势
错误姿势
1
2
3
4
5
6
|
#define UIScrollViewKeyboardDismissModeNone 0
#define UIScrollViewKeyboardDismissModeOnDrag 1
#define UIScrollViewKeyboardDismissModeInteractive 2
// 接收值就得这样:
int UIScrollViewKeyboardDismissMode = UIScrollViewKeyboardDismissModeNone;
|
为什么这样做不好:
- 宏定义没有类型约束,只是单纯的替换。
- 可读性较差。
- 可以用int也可以用UIInteger来接收。
正确姿势
1
2
3
4
5
6
7
8
|
typedef enum {
UIScrollViewKeyboardDismissModeNone = 0,
UIScrollViewKeyboardDismissModeOnDrag,
UIScrollViewKeyboardDismissModeInteractive
} UIScrollViewKeyboardDismissMode;
// 指明枚举类型
UIScrollViewKeyboardDismissMode mode = UIScrollViewKeyboardDismissModeNone;
|
用起来就是这样的:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
- (void)dealWithMode:(UIScrollViewKeyboardDismissMode)mode {
switch (mode) {
case UIScrollViewKeyboardDismissModeNone:
//...
break;
case UIScrollViewKeyboardDismissModeOnDrag:
//...
break;
case UIScrollViewKeyboardDismissModeInteractive:
//...
break;
}
}
|
这样枚举解决了上面1和2的缺点,但是第3点还是没有解决,我依然可以这样搞:
1
2
3
|
int mode = UIScrollViewKeyboardDismissModeNone;
// or
UIInteger mode = UIScrollViewKeyboardDismissModeNone;
|
完美姿势
NS_ENUM是枚举在Objective-C中的”升级版”,改进后代码如下:
1
2
3
4
5
|
typedef NS_ENUM(NSInteger, UIScrollViewKeyboardDismissMode) {
UIScrollViewKeyboardDismissModeNone,
UIScrollViewKeyboardDismissModeOnDrag,
UIScrollViewKeyboardDismissModeInteractive
};
|
代码很简单,不理解的话可以评论求解答。
选项的使用姿势
如果有一个”选项变量”要同时表示一个或者多个值肿么办?这时就得上我们的NS_OPTIONS了。
比如有这样一个简单的例子:
1
2
3
4
5
|
typedef NS_OPTIONS(NSUInteger, JZZPersonType) {
JZZPersonTypeHigh = 0,
JZZPersonTypeRich = 1 << 0,
JZZPersonTypePretty = 1 << 1
};
|
可以看到,我们这里的选项是用的位运算的方式定义的,这样的好处就是我们的选项变量可以这样来表示:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
// 用“或|”运算同时赋值多个选项
JZZPersonType personType = JZZPersonTypeHigh | JZZPersonTypeRich | JZZPersonTypePretty;
// 用“与&”运算取出对应位
if (personType & JZZPersonTypeHigh) {
NSLog(@"高");
}
if (personType & JZZPersonTypeRich) {
NSLog(@"富");
}
if (personType & JZZPersonTypePretty) {
NSLog(@"帅");
}
|
“|”赋值完后,富帅的内心(内存)其实是长这样的:
Write the code ,change the world!