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

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

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

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

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

   // 审核员和代采、审核和采购员不可同时勾选
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. 伪元素::before与::after的用法

    ::before与::after两个伪元素其实是CSS3中的内容,然而实际上在CSS2中就已经有了这两者的身影,只不过CSS2中是前面加一个冒号来表示(:before和:after).今天主要讲讲这两 ...

  2. Angular进阶教程三

    7 总结 angular上手比较难,初学者(特别是习惯了使用JQuery的人)可能不太适应其语法以及思想.随着对ng探索的一步步深入,也确实感觉到了这一点,尤其是框架内部的某些执行机制. 7.1页面效 ...

  3. 【MFC】CHtmlView或WebBrowser禁止脚本错误提示

    错误展示: 解决办法: 1.CHtmlView类或子类 CHtmlView::SetSilent(TRUE); 2.IWebBrowser2控件 IWebBrowser2::put_Silent(TR ...

  4. apk 反编译 - 最新版图文教程

    apk 反编译 - 最新版图文教程 结合网上众多教程,整理一篇自己操作的,工具都是目前最新版 apk 反编译也就是将打包后的 apk 反编译为资源文件(图片).layout.样式.相关的实现代码等.( ...

  5. 小程序填坑之路(二):cover-view

    https://blog.csdn.net/mr_chen95/article/details/79261987 在一些情况下,我们需要对map.video.canvas.camera这些微信小程序的 ...

  6. Windows Socket和Linux Socket编程的区别 ZZ

    socket相关程序从Windows移植到Linux下需要注意的: 1)头文件 Windows下winsock.h/winsock2.h Linux下sys/socket.h 错误处理:errno.h ...

  7. Android开发(7)数据库和Content Provider

    问题聚焦: 思想:应用程序数据的共享 对数据库的访问仅限于创建它的应用程序,但是事情不是绝对的 Content Provider提供了一个标准的接口,可供其他应用程序访问和使用其他程序的数据 下面我们 ...

  8. 深圳云栖大会人工智能专场:探索视频+AI,玩转智能视频应用

    摘要: 在人工智能时代,AI技术是如何在各行业和领域真正的发挥应用和商业价值,带来产业变革才是关键.在3月28日深圳云栖大会的人工智能专场中,阿里云视频服务技术专家邹娟将带领大家探索熟悉的视频场景中, ...

  9. Web前端——jQuery----细节

    jQuery终极思想:创建jQuery对象(当发现相同的选择器在你的代码里出现多次时,请用变量把它储存起来.一切面向对象) 认识jQuery 1.jQuery库可以做什么? HTML元素选取 HTML ...

  10. 做 fzu oj 1003 简单的枚举

    暴力求解法---简单枚举 定义一个函数(函数的内容大概是包含了题目所给的限制条件),然后主函数就是通过循环进行枚举,枚举出可能的元素,带入函数中进行验证,如果符合函数所给的情况,则为其解.