美文网首页iOS开发实用技术
NS_ENUM枚举和Block的巧妙搭配

NS_ENUM枚举和Block的巧妙搭配

作者: ZfRee | 来源:发表于2019-08-13 19:48 被阅读28次

    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.

    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错误.

    build Error

    这样一来就再也不会出现该枚举的逻辑遗漏了,毕竟command + B爆红的 errorwarning更让程序员操心:(

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

    相关文章

      网友评论

        本文标题:NS_ENUM枚举和Block的巧妙搭配

        本文链接:https://www.haomeiwen.com/subject/gkzvdctx.html