UITableView 几乎是每一个原生 App 都会使用到的控件,所以你一定对 UITableViewDataSourceUITableViewDelegate 中的代理方法很熟悉。在一些代理方法中有时候我们需要对不同的 section、row 进行分开处理,此时我们都会使用 switch 来应对。所以接下来将会介绍一种更好的 switch 使用方案。

常规处理

大多数情况下,我们使用的 switch 方案都是类似下面的硬编码方式:


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {switch indexPath.section {case 0: // Dequeue a cell for section 0case 1: // Dequeue a cell for section 1// And so on...default: fatalError("Unhandled section \(indexPath.section)")}
}

上诉代码在功能上并没有什么权限,但是这种硬编码方式对后期的代码维护带来的隐性成本。其实一个好的编程习惯就是最大限度的避免硬编码,无论是 switch 还是设置 view 的 tag 的时候都应该采用更为“优雅”的方式。

更好的处理方式

对于硬编码的优雅的替换方案大多数情况下都是使用 enum 方式,在枚举类型中我们可以使用更具识别性的词语。这样不仅能一眼识别含义,而且在后期修改的过程中也不用满世界找硬编码的数字生怕有遗漏。

接下来直接上码:

protocol ReusableViewEnum {}extension ReusableViewEnum where Self: RawRepresentable, Self.RawValue == Int {static var all: [Self] {var index = 0var allItems = [Self]()while let item = Self(rawValue: index) {allItems.append(item)index += 1}return allItems}static func build(with value: Int) -> Self {guard let row = Self(rawValue: value) else {fatalError("Unimplemented value: \(value)")}return row}
}// ---------------------
// EXAMPLE USAGE CODE:// You only have to define the enum
fileprivate enum ProfileSections: Int, ReusableViewEnum {case picture = 0case namecase emailcase password
}// And use it in your code:
func numberOfSections(in tableView: UITableView) -> Int {return ProfileSections.all.count
}func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {switch ProfileSection.build(with: section) {case .picture   : return 1case .name      : return 1  case .email     : return 1 case .password  : return 1 }
}   func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {switch ProfileSection.build(with: indexPath.section) {case .picture   : // Dequeue profile picture sectioncase .name      : // Dequeue name sectioncase .email     : // Dequeue email sectioncase .password  : // Dequeue password section}
}

首先,我们什么了 ReusableViewEnum 协议并对其进行了拓展。在拓展中我们添加了一个计算属性 all, 用于表示遵循该协议并且 rawValue 为 Int的枚举类型的所有取值。另外增加了用 Int 来构建枚举类型的函数 build

在使用实例中我们定义了枚举类型 ProfileSections,并在 UITableView 的代理方法中实现了上面 ReusableViewEnum 协议的应用。应用后的 switch 方案代码风格更为有效,后期维护效率也明显优于之前的硬编码方式。

UITableView 协议方法中更好的 switch 使用方案相关推荐

  1. matlab分支定界法linprog_序列比对(二十二)——中间字符串分支定界方法中更紧的界...

    原创: hxj7 前文介绍了中间字符串的算法和代码,但是使用分支定界策略时所使用的界限是很宽松的.本文给出了一个更紧的界限. 对分支定界法的简单回顾 前文<序列比对(21)中间字符串问题的算法及 ...

  2. 终端服务器安全层在协议流中检测到错误,并已取消客户端连接。客户端IP:x.x.x.解决方法

    终端服务器安全层在协议流中检测到错误,并已取消客户端连接.客户端IP:x.x.x.解决方法 事件类型: 错误 事件来源: TermDD 描述: RDP 的 "DATA ENCRYPTION& ...

  3. UC伯克利提出小批量MH测试:令MCMC方法在自编码器中更强劲

    转载请注明出处:乐投网 - UC伯克利提出小批量MH测试:令MCMC方法在自编码器中更强劲 近日伯克利大学官方博客发文提出小批量 MH(Minibatch Metropolis-Hastings),即 ...

  4. SpringCloud工作笔记048---RESTful API 中 HTTP 状态码的定义_以及把RESTFul版本号_放到http协议header中_以及RestFul设计时的两个误区

    JAVA技术交流QQ群:170933152 ------------------------- RESTful架构有一些典型的设计误区. 最常见的一种设计错误,就是URI包含动词.因为"资源 ...

  5. IMAP协议RFC3501中文文档 .

    IMAP协议RFC3501中文文档 . 分类: 各类协议标准文档 2011-05-18 09:48 1238人阅读 评论(0) 收藏 举报 因特网邮件访问协议,版本4rev1(IMAP4rev1)允许 ...

  6. 动态划分VLAN的方法中不包括(23)。【答案】C

    动态划分VLAN的方法中不包括(23). (23)A.网络层协议 B.网络层地址 C.交换机端口 D.MAC地址 [答案]C [解析] 在交换机上实现VLAN,可以采用静态的或动态的方法: ①静态分配 ...

  7. java 调用父级方法_java子类调用父类的方法中包含子类重写的实例方法

    # 看题目是不是很绕,这个我也不知道怎么才能更简单的表达了 # 先看代码: public class Common { public static void main(String[] args) { ...

  8. C#方法中参数ref和out的解析

    一.C#方法中参数类型 有4种参数类型,有时候很难记住它们的不同特征,下图对它们做一个总结,使之更容易比较和对照. 二.C#方法中的参数 1.值参数 使用值参数,通过复制实参的值到形参的方式把数据传递 ...

  9. 如何在返回String的Spring MVC @ResponseBody方法中响应HTTP 400错误?

    本文翻译自:How to respond with HTTP 400 error in a Spring MVC @ResponseBody method returning String? I'm ...

最新文章

  1. mybatis-plus团队新作:mybatis-mate 轻松搞定数据权限
  2. 北京大学崔斌教授组招收图机器学习、AutoML等方向科研实习生
  3. 战略突破!又一国产芯片巨头即将追赶华为,成为思科的替代者?
  4. python输出数据到excel-python如何导出数据到excel文件
  5. 途牛网站无线架构变迁实践
  6. 用tolower()和toupper()来实现对string进行大小写转换
  7. php文件在桌面删除不了图片吗,删除windows桌面上某个应用程序的图标,意味着什么...
  8. 前端须知的 Cookie 知识小结
  9. 国产与第三方库FFmpeg SDK
  10. 利用JNative实现Java调用动态库
  11. GY的实验室 - Phalcon+Nginx+PHP-FPM环境搭建
  12. 《信息安全系统设计基础》实验一 开发环境的熟悉
  13. linux 环境下安装oracle11g方法及安装过程中遇上的问题解决方法
  14. python环境精简版_【Python专题(一)】Python环境搭建
  15. oppo9.0系统手机一键激活Xposed框架的步骤
  16. cf黑机器多久解除_[CF]黑机器码过无限提示一分钟强制踢出游戏的方法
  17. 气象台发布的拼图重投影示例
  18. 拓嘉辰丰电商:关于拼多多推广计划有哪些问题
  19. 7.2—查找—Sear Insert Position
  20. 硬件工程师成长之路(11)——职业规划

热门文章

  1. 《软件工程》总结——第一章
  2. leetcode. Intersection of Two Linked Lists
  3. objectC时间用法
  4. URLRewiter使用
  5. windows API 菜鸟学习之路(一)
  6. windows--bat--删除当前脚本del %0
  7. JAVA面试要点010---重入锁_ReentrantLock 详解
  8. android学习笔记---56_activity切换动画与页面切换动画,自定义activity窗口切换动画效果的实现.
  9. 读取图像到txt的程序
  10. c++ string详解 assign