美文网首页iOS随笔
iOS中使用位运算判断权限

iOS中使用位运算判断权限

作者: 095b62ead3cd | 来源:发表于2018-12-17 10:50 被阅读7次

    在iOS的某些权限判断中,使用位运算可以起到很方便快捷的作用,示例代码:

     if ([OCTAuthorityManager authorityOfUser] & OCTInspectionAuthorityTransferAdd || [OCTAuthorityManager authorityOfUser] & OCTInspectionAuthorityDiaryAdd || [OCTAuthorityManager authorityOfUser] & OCTInspectionAuthorityAddNotice || [OCTAuthorityManager authorityOfUser] & OCTInspectionAuthorityAddRepair) {
                //根据不同的权限,设置不同的显示界面
                //code
            }
    

    其中[OCTAuthorityManager authorityOfUser] 是给不同的职位返回各自不同的权限枚举值:

    + (OCTInspectionAuthority)authorityOfUser{
        OCTUserModel *shareUser = [OCTUserModel shareUser];
        if (!shareUser.userPostId || 0 == shareUser.userPostId.length) {
            return OCTInspectionAuthorityNone;
        }
        NSInteger postId = shareUser.userPostId.integerValue;
    #if DEBUG
        //return OCTInspectionAuthorityAll;
    #endif    
        if (0 == postId) {
            return OCTInspectionAuthorityAll;
        }else if (OCTPostViceManager == postId){
            //副总经理
            return OCTInspectionAuthorityCheckTransfer | OCTInspectionAuthorityAddNotice | OCTInspectionAuthorityCheckRunningRecord | OCTInspectionAuthorityCheckInspection | OCTInspectionAuthorityCheckTrouble;
        }
        if ([shareUser.userDepartmentId hasPrefix:OCTTouristDepartmentPrefix]) {
            //游客部
            switch (postId) {
                case OCTPostOperator:
                    //操作员
                    return OCTInspectionAuthorityCheckTransfer | OCTInspectionAuthorityAddTransfer| OCTInspectionAuthorityCheckRunningRecord| OCTInspectionAuthorityAddRunningRecord;
                case OCTPostForeman:
                    //领班
                    return OCTInspectionAuthorityCheckTransfer | OCTInspectionAuthorityAddNotice | OCTInspectionAuthorityCheckRunningRecord;
                case OCTPostCharge:
                    //主管
                    return OCTInspectionAuthorityCheckTransfer | OCTInspectionAuthorityAddNotice | OCTInspectionAuthorityCheckRunningRecord;
                case OCTPostHeader:
                    //部长
                    return OCTInspectionAuthorityCheckTransfer | OCTInspectionAuthorityAddNotice | OCTInspectionAuthorityCheckRunningRecord;
                case OCTPostOther:
                    //其他
                    return OCTInspectionAuthorityCheckTransfer | OCTInspectionAuthorityCheckRunningRecord;
                default:
                    break;
            }
        }else if ([shareUser.userDepartmentId hasPrefix:OCTTechnologyDepartmentPrefix]){
            //技术部
            switch (postId) {
                case OCTPostFixer:
                    //操作员
                    return OCTInspectionAuthorityCheckInspection | OCTInspectionAuthorityAddInspection | OCTInspectionAuthorityCheckTransfer | OCTInspectionAuthorityCheckTrouble |OCTInspectionAuthorityAddRepair | OCTInspectionAuthorityFixDone;
                case OCTPostForeman:
                    //领班
                    return OCTInspectionAuthorityCheckInspection | OCTInspectionAuthorityCheckTransfer | OCTInspectionAuthorityCheckTrouble |OCTInspectionAuthorityAddNotice | OCTInspectionAuthorityAddInspection | OCTInspectionAuthorityExamineInspection;
                case OCTPostEngineer:
                case OCTPostCharge:
                    //主管
                    return OCTInspectionAuthorityCheckInspection | OCTInspectionAuthorityCheckTransfer | OCTInspectionAuthorityCheckTrouble |OCTInspectionAuthorityAddNotice | OCTInspectionAuthorityExamineInspection;
                case OCTPostHeader:
                    //部长
                    return OCTInspectionAuthorityCheckInspection | OCTInspectionAuthorityCheckTransfer | OCTInspectionAuthorityCheckTrouble | OCTInspectionAuthorityAddNotice;
                case OCTPostOther:
                    //其他
                    return OCTInspectionAuthorityCheckInspection | OCTInspectionAuthorityCheckTransfer | OCTInspectionAuthorityCheckTrouble;
                default:
                    break;
            }
        }else if ([shareUser.userDepartmentId hasPrefix:OCTTubeDepartmentPrefix]){
            switch (postId) {
                case OCTPostFixer:
                    //操作员
                    return  OCTInspectionAuthorityLookUp |OCTInspectionAuthorityInspectNewlyAdded |OCTInspectionAuthorityTransferLookUp|
                            OCTInspectionAuthorityTransferAdd |OCTInspectionAuthorityDiaryLookUp|OCTInspectionAuthorityDiaryAdd;
                case OCTPostForeman:
                    //领班
                    return  OCTInspectionAuthorityLookUp |OCTInspectionAuthorityInspectNewlyAdded |OCTInspectionAuthorityTransferLookUp|
                            OCTInspectionAuthorityTransferAdd |OCTInspectionAuthorityDiaryLookUp|OCTInspectionAuthorityDiaryAdd;
                    
                case OCTPostEngineer:
                case OCTPostCharge:
                    //主管
                    return OCTInspectionAuthorityLookUp |OCTInspectionAuthorityTransferLookUp|OCTInspectionAuthorityDiaryLookUp;
                    
                case OCTPostHeader:
                    //部长
                    return OCTInspectionAuthorityLookUp |OCTInspectionAuthorityTransferLookUp|OCTInspectionAuthorityDiaryLookUp;
    
                case OCTPostOther:
                    //其他
                    return OCTInspectionAuthorityLookUp |OCTInspectionAuthorityTransferLookUp|OCTInspectionAuthorityDiaryLookUp;
    
                default:
                    return  OCTInspectionAuthorityLookUp |OCTInspectionAuthorityInspectNewlyAdded |OCTInspectionAuthorityTransferLookUp|
                    OCTInspectionAuthorityTransferAdd |OCTInspectionAuthorityDiaryLookUp|OCTInspectionAuthorityDiaryAdd;
            }
    |OCTInspectionAuthorityDiaryLookUp|OCTInspectionAuthorityDiaryAdd;
        }
        return OCTInspectionAuthorityNone;
    }
    

    相关枚举值如下:

    typedef NS_ENUM(NSUInteger,OCTInspectionAuthority){
        OCTInspectionAuthorityNone = 0,        //没有权限
        OCTInspectionAuthorityAddInspection = 1 << 0,    //添加日周月检
        OCTInspectionAuthorityCheckInspection = 1 << 1, //查看日周月检
        OCTInspectionAuthorityExamineInspection = 1 << 2, //审核日周月间
        OCTInspectionAuthorityCheckTransfer = 1 << 3,  //查看操作故障移交
        OCTInspectionAuthorityCheckTrouble = 1 << 4, //查看操作故障列表
        OCTInspectionAuthorityAddTransfer = 1 << 5, //新增故障移交
        OCTInspectionAuthorityAddRepair = 1 << 6,  //新增故障维修
        OCTInspectionAuthorityAddNotice = 1 << 7,  //新增公告
        OCTInspectionAuthorityCheckRunningRecord = 1 << 8, //运行记录权限
        OCTInspectionAuthorityAddRunningRecord = 1 << 9,    //新增运行记录权限
        OCTInspectionAuthorityFixDone = 1 << 10,            //完成维修权限
        OCTInspectionAuthorityLookUp= 1 << 11,              //物管检查列表查看
        OCTInspectionAuthorityInspectNewlyAdded= 1 << 12,   //物管检查列表新增
        OCTInspectionAuthorityTransferLookUp= 1 << 13,      //故障维修查看
        OCTInspectionAuthorityTransferAdd= 1 << 14,         //故障维修新增
        OCTInspectionAuthorityDiaryLookUp= 1 << 15,         //值班日志查看
        OCTInspectionAuthorityDiaryAdd= 1 << 16,            //值班日志新增
        
        OCTInspectionAuthorityAll = OCTInspectionAuthorityAddInspection |
        OCTInspectionAuthorityCheckInspection |
        OCTInspectionAuthorityExamineInspection |
        OCTInspectionAuthorityCheckTransfer |
        OCTInspectionAuthorityCheckTrouble |
        OCTInspectionAuthorityAddTransfer |
        OCTInspectionAuthorityAddRepair |
        OCTInspectionAuthorityAddNotice |
        OCTInspectionAuthorityCheckRunningRecord |
        OCTInspectionAuthorityAddRunningRecord |
        OCTInspectionAuthorityFixDone |
        OCTInspectionAuthorityLookUp |
        OCTInspectionAuthorityInspectNewlyAdded |
        OCTInspectionAuthorityTransferLookUp |
        OCTInspectionAuthorityTransferAdd |
        OCTInspectionAuthorityDiaryLookUp |
        OCTInspectionAuthorityDiaryAdd //全部权限
    };
    

    附:整数在计算机中用二进制的位来表示,C语言提供一些运算符可以直接操作整数中的位,称为位运算,这些运算符的操作数都必须是整型的。

     & 按位与,   | 按位或 ,  ^ 按位异或
    1 & 1 = 1, 1 | 1 = 1, 1 ^ 1 = 0
    1 & 0 = 0, 1 | 0 = 1, 1 ^ 0 = 1
    0 & 1 = 0, 0 | 1 = 1, 0 ^ 1 = 1
    0 & 0 = 0, 0 | 0 = 0, 0 ^ 0 = 0
    

    相关文章

      网友评论

        本文标题:iOS中使用位运算判断权限

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