在这个开发周期遇到这样一个需求:

管理员可以给子账号配置权限,有些权限存在互斥不可同时勾选,比如

审核员和代采、审核和采购员不可同时勾选

之前同事实现的方式如下:

这样每添加一个互斥关系就要遍历一次,低效且代码繁琐。

   // 审核员和代采、审核和采购员不可同时勾选
if ([tag isEqualToString:@"审核"] && selected) {
for (ZSRoleOptionDTO *dto in self.roleDto.roleOptions) {
if ([dto.rolename isEqualToString:@"采购"] || [dto.rolename isEqualToString:@"代采"]) {
dto.isSelected = NO;
}
}
}
if ([tag isEqualToString:@"采购"]) {
for (ZSRoleOptionDTO *dto in self.roleDto.roleOptions) {
if ([dto.rolename isEqualToString:@"审核"] && selected) { /// 审核和采购员不可同时勾选
dto.isSelected = NO;
} else if ([dto.rolename isEqualToString:@"代采"] && !selected) { /// 取消采购默认取消代采
dto.isSelected = NO;
break;
}
}
}
/// 选择代采默认选择采购
if ([tag isEqualToString:@"代采"] && selected) {
for (ZSRoleOptionDTO *dto in self.roleDto.roleOptions) {
if ([dto.rolename isEqualToString:@"采购"]) {
dto.isSelected = YES;
} else if ([dto.rolename isEqualToString:@"审核"]) { /// 审核员和代采不可同时勾选
dto.isSelected = NO;
}
}
}

考虑到以后可能继续添加互斥关系,在此使用map保存互斥关系,

这样每添加一种互斥关系只需要在map内增加对应的键值对就可以了,

大大简化了逻辑,使代码更加清晰易于维护。

     // 审核员和代采、审核和采购员不可同时勾选
// 使用 map 保存 互斥关系 ,k-v 表示 互斥
NSDictionary *dict = @{
@"审核" : @"采购代采",
@"代采" : @"审核",
@"采购" : @"审核"
}; NSString *mutex = [dict valueForKey:tag]; if (!IsStrEmpty(mutex) && selected) {
for (ZSRoleOptionDTO *dto in self.roleDto.roleOptions) {
if ([mutex containsString:dto.rolename]) {
dto.isSelected = NO;
}
}
}

用 map 表达互斥逻辑的更多相关文章

  1. 产品经理之UML表达业务逻辑

    文章大纲 一. 什么是UML二. UML基础介绍三.UML实例介绍四.参考文档   一. 什么是UML   UML(Unified Modeling Language,统一建模语言) 是一种在软件设计 ...

  2. ceph之crush map

    编辑crush map: 1.获取crush map: 2.反编译crush map: 3.至少编辑一个设备,桶, 规则: 4.重新编译crush map: 5.重新注入crush map: 获取cr ...

  3. map & flatMap 浅析

    我之前一直以为我是懂 map 和 flatMap 的.但是直到我看到别人说:「一个实现了 flatMap 方法的类型其实就是 monad.」我又发现这个熟悉的东西变得陌生起来,本节烧脑体操打算更细致一 ...

  4. Memory Map

    计算机最重要的功能单元之一是Memory.Memory是众多存储单元的集合,为了使CPU准确地找到存储有某个信息的存储单元,必须为这些单元分配一个相互区别的“身份证号”,这个“身份证号”就是地址编码. ...

  5. java 集合框架(十六)Map

    一.概述 Map是一个包含键值对的集合,一个map不能有重复的键(key),而且每个键至多只能对应一个值.Map同Collection一样,它的所有通用实现都会提供一个转换器构造函数,接收一个Map类 ...

  6. Swift 烧脑体操(四) - map 和 flatMap

    前言 Swift 其实比 Objective-C 复杂很多,相对于出生于上世纪 80 年代的 Objective-C 来说,Swift 融入了大量新特性.这也使得我们学习掌握这门语言变得相对来说更加困 ...

  7. java apache-commons-collections中Map辅助类的使用

    前言 apache-commons-collections中Map辅助类,很是有用.尽管我们通过原生Map经过业务逻辑处理也能达到相同的作用与效果,但毕竟作为一个开源的工具类辅助类,对它有个了解还是有 ...

  8. 【Go语言】map在goroutine通信中的使用问题

    简介 本篇文章的主要内容是解决go语言map在使用中遇到的两个问题,对于初学者是不可避免的坑 一.cannot assign to struct field 当map中存在struct类型的成员,如果 ...

  9. 一篇面经(BAT面试)(转)

    0. 写在之前 首先呢我的面试经历和一些面霸和收割机的大神相比绝不算丰富,但我这三个月应该能代表很大一部分人的心路历程:从无忧无虑也无知的状态,然后遭遇挫败,跌入低谷,连续数天的黑暗,慢慢调整,逼着自 ...

随机推荐

  1. drupal7区块内容对象

    区块内容对象

  2. 关于webpack 配置文件找不到

    运行命令  npm run eject 将配置文件解压出来 如果运行这个命令有错的时候,很可能与 git 有关 这时候,打开项目文件夹,显示所有隐藏的文件夹(工具),如果显示了git 的文件夹  删掉 ...

  3. Mybatis学习第三天——输入输出映射以及动态SQL

    注意:以下传入数据与输出数据类型部分使用别名的方式,别名在SqlMapConfig.xml核心文件中配置 1.输入映射 1.1 传递简单数据类型 1.2 传递pojo中的类类型 1.3 传递Query ...

  4. 自学git心得-4

    本节介绍分支的一些具体应用实例. 1.Bug分支 设想我们正在分支dev上工作,突然接到一个修复bug的命令,我们需要创建分支issue-101来修复它,在此之前我们肯定需要先保存我们当前未完成的工作 ...

  5. bootstrap-table 分页增删改查之一(增加 删除)

    先上效果图 引入js文件 <!--js jquery --> <script type="text/javascript" src="${pageCon ...

  6. linux Mint 安装网易云音乐

    第一天从官网下来了最新版netease-cloud-music_1.1.0_amd64_ubuntu.deb安装,用的挺好的,第二天就打不开了郁闷,查了下很多人都遇到了这样的问题,需要root权限运行 ...

  7. 【Leetcode】【Hard】Copy List with Random Pointer

    A linked list is given such that each node contains an additional random pointer which could point t ...

  8. FDFDF

    Linux(Centos)之安装Nginx及注意事项   1.Nginx的简单说明 a.  Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器,期初开发的目的 ...

  9. 用setTimeout实现动态时钟的效果

    1.获取到系统时间 2.获取到当地时间字符串 3.开启延时器,每一秒刷新一次时间 <!DOCTYPE html> <html> <head> <meta ch ...

  10. ES6重点--笔记(转)

    最常用的ES6特性 let, const, class, extends, super, arrow functions, template string, destructuring, defaul ...