当前位置: 首页 > news >正文

[Swift] Enum 好用, Enum 可以更易用

为什么80%的码农都做不了架构师?>>>   hot3.png

Swift 中的枚举可以说好用到让我惊讶. 但是我可以让它更易用.

经典用例

比如 用它来封装 应用 微信的 Tab 栏枚举,如下:

enum AppTab{
    case wechat,contacts,discover,me
}

到这里已经比用整型常量好很多了. 好了,现在你想将 UITabBarItem 中的构造封装在里面.

  1. 首先我们为其添加一个 title 属性,如下:
extension AppTab{
  var title:String{
    switch self {
    case .wechat: return "微信"
    case .contacts: return "通讯录"
    case .discover: return "发现"
    case .me: return "我"
    }
  }
}

然后.就可以直接使用 .title 就可以访问了. 避免了 使用字典保存映射的麻烦. 写法,修改也简单.

  1. 你想判断某一个 AppTab 值是不是 me. 你选择这样做 if tab == .wechat 嗯, Swift 中可以直接写 .wechat 这样的枚举值真方便. 但是你也可以这样. 添加一个 Bool 类型的 Computed Property.
extension AppTab{
  var isWechat:Bool{ return self == .wechat }
}

然后你想为所有的枚举值都加上这样的 Computed Property. 你复制粘贴然后修改.

  1. 很多时候,你想遍历枚举值, 于是你添加了一个静态属性.保存所以的枚举值为一个数组. 如下:
extension AppTab{
  static let allCases:[ AppTab] = [.wechat, .contacts, .discover, .me]
}

动起来

so far, so good. 那我可以帮到你什么呢? 我可以帮你少写代码. 怎么帮?

  1. 只需要写少量的几行声明:

如下.

AppTab
wechat:微信
contacts: 通讯录
discover:发现
me:我

选中, 右键, 选择 "Services|generate_enum" 然后如下代码就自动生成了:

//AppTab
//wechat:微信
//contacts: 通讯录
//discover:发现
//me:我
enum AppTab  {
     case wechat, contacts,discover,me
    var isWechat:Bool{ return self == .wechat }
    var isContacts:Bool{ return self == .contacts }
    var isDiscover:Bool{ return self == .discover }
    var isMe:Bool{  return self == .me }
    var title:String{
        switch self{
        case .wechat:return "微信"
        case .contacts:return " 通讯录"
        case .discover:return "发现"
        case .me:return "我"
        }
    }
    static let allCases:[AppTab] = [.wechat,.contacts,.discover,.me]
}

怎么样? 来试试吧! 当然还有其他选项可以使用. 如果你有其他需要麻烦告诉我. 当然有 PR 最好了.

最后来张动图感受一下:

Generate Enum

代码在:

OSC Git

Github

转载于:https://my.oschina.net/banxi/blog/811302

相关文章:

  • VUE中的全局时间过滤器(格式化时间)
  • Android ScrollView滑动事件和子控件点击事件冲突
  • 阿里云CentOs8安装node,pm2,mysql数据库以及运行.sql文件
  • cocoapods安装完第三方类库后不生成workspace
  • 阿里云CentOs搭建node环境以及配置API接口服务器
  • 区块链之以太坊初体验——以太坊平台学习总结
  • 阿里云CentOs中Vue项目的上线(node+express+pm2)
  • iptables总结_02
  • uni-app中的分类页面(仿京东分类页面)(scroll-view的使用)
  • oracle select decode判断 ,sign使用例子
  • 快速入门vuex带案例说明(超详细易理解)
  • wifi信道1,6,11科普
  • uni-app中微信小程序端使用腾讯地图API实现定位服务(超详细教程)
  • CSS 3学习——transition 过渡
  • 关于React中DOM,虚拟DOM及diff算法的理解
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • cookie和session
  •  D - 粉碎叛乱F - 其他起义
  • exif信息对照
  • JS实现简单的MVC模式开发小游戏
  • Laravel Mix运行时关于es2015报错解决方案
  • laravel with 查询列表限制条数
  • Mysql优化
  • PHP CLI应用的调试原理
  • vagrant 添加本地 box 安装 laravel homestead
  • Web Storage相关
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 反思总结然后整装待发
  • 基于组件的设计工作流与界面抽象
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 如何选择开源的机器学习框架?
  • PostgreSQL之连接数修改
  • 阿里云移动端播放器高级功能介绍
  • 通过调用文摘列表API获取文摘
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • ###项目技术发展史
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • #QT(一种朴素的计算器实现方法)
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (三)模仿学习-Action数据的模仿
  • (学习日记)2024.01.19
  • (一)VirtualBox安装增强功能
  • (一)认识微服务
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)jQuery 基础
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • .NET DataGridView数据绑定说明
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • @Transaction注解失效的几种场景(附有示例代码)