NS_ENUM枚举和Block的巧妙搭配

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.

NS_ENUM枚举和Block的巧妙搭配_第1张图片
warning.png
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错误.

NS_ENUM枚举和Block的巧妙搭配_第2张图片
build Error

这样一来就再也不会出现该枚举的逻辑遗漏了,甚至有点函数式编程内味儿了? 毕竟command + B爆红的 errorwarning更让程序员操心:(

base:https://zhuanlan.zhihu.com/p/31204326

你可能感兴趣的:(NS_ENUM枚举和Block的巧妙搭配)