iOS的枚举NS_ENUM
,对于我们开发人员来说,再熟悉不过了,下面来说说几种不同的写法.
比如,我们有一个菜单类型的枚举
,根据菜单类型的不同,处理的事情也不一样.
/**
菜单类型
*/
typedef NS_ENUM(NSInteger, XXMenuType) {
XXMenuTypeA = 0,
XXMenuTypeB,
XXMenuTypeC,
};
@property (nonatomic, assign) XXMenuType currentType;
一、枚举 + if else
比较常见的通过if else
做条件匹配的写法
if(_currentType == XXMenuTypeA){
}else if (_currentType == XXMenuTypeB){
}else if (_currentType == XXMenuTypeC){
}
但是当开发的后期,枚举增加了新的类型XXMenuTypeD
,如果没有再进行else if
那逻辑判断就出现了遗漏.或者说最后判断使用的是else
,那就将多种类型都归入了else
逻辑分支,这是我们不希望发生的.
二、与switch case配套使用
当枚举和switch case
搭配使用时,不要写default
.
switch (_currentType) {
case XXMenuTypeA:
//logic A
break;
case XXMenuTypeB:
//logic B
break;
case XXMenuTypeC:
//logic C
break;
}
这是如果新增了XXMenuTypeD
,Xcode会通过warning
的方式显示的提醒我们还有类型没有处理,要我们加上case
.
switch case
比起if else
更一目了然.
三、巧妙搭配Block
借助Block + Switch Case + function
封装一个使用
//.h文件中
typedef void (^menuTypeBlock) (void);
- (void)matchMenuTypeA:(menuTypeBlock)blockA menuTypeB:(menuTypeBlock)blockB menuTypeC:(menuTypeBlock)blockC;
//.m文件
- (void)matchMenuTypeA:(menuTypeBlock)blockA menuTypeB:(menuTypeBlock)blockB menuTypeC:(menuTypeBlock)blockC{
switch (_currentType) {
case XXMenuTypeA:
!blockA ? :blockA();
break;
case XXMenuTypeB:
!blockB ? :blockB();
break;
case XXMenuTypeC:
!blockC ? :blockC();
break;
}
}
//调用方
[obj matchMenuTypeA:^{
//code
} menuTypeB:^{
//code
} menuTypeC:nil];
仅有一处使用时这样写代码,会觉得有点繁琐,增加了代码量却没有太大的用处.
但当有多处使用,在增加了一种枚举类型时,只要我们修改了这个方法名,那么外部使用到该function
的位置Xcode都会显示为红色的error
错误.
这样一来就再也不会出现该枚举的逻辑遗漏了,甚至有点函数式编程内味儿了? 毕竟command + B
爆红的 error
比warning
更让程序员操心:(
base:https://zhuanlan.zhihu.com/p/31204326