iOS中使用位运算判断权限
2018-12-17 本文已影响7人
095b62ead3cd
在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