UITableView 协议方法中更好的 switch 使用方案
UITableView 几乎是每一个原生 App 都会使用到的控件,所以你一定对 UITableViewDataSource、UITableViewDelegate 中的代理方法很熟悉。在一些代理方法中有时候我们需要对不同的 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 使用方案相关推荐
- matlab分支定界法linprog_序列比对(二十二)——中间字符串分支定界方法中更紧的界...
原创: hxj7 前文介绍了中间字符串的算法和代码,但是使用分支定界策略时所使用的界限是很宽松的.本文给出了一个更紧的界限. 对分支定界法的简单回顾 前文<序列比对(21)中间字符串问题的算法及 ...
- 终端服务器安全层在协议流中检测到错误,并已取消客户端连接。客户端IP:x.x.x.解决方法
终端服务器安全层在协议流中检测到错误,并已取消客户端连接.客户端IP:x.x.x.解决方法 事件类型: 错误 事件来源: TermDD 描述: RDP 的 "DATA ENCRYPTION& ...
- UC伯克利提出小批量MH测试:令MCMC方法在自编码器中更强劲
转载请注明出处:乐投网 - UC伯克利提出小批量MH测试:令MCMC方法在自编码器中更强劲 近日伯克利大学官方博客发文提出小批量 MH(Minibatch Metropolis-Hastings),即 ...
- SpringCloud工作笔记048---RESTful API 中 HTTP 状态码的定义_以及把RESTFul版本号_放到http协议header中_以及RestFul设计时的两个误区
JAVA技术交流QQ群:170933152 ------------------------- RESTful架构有一些典型的设计误区. 最常见的一种设计错误,就是URI包含动词.因为"资源 ...
- IMAP协议RFC3501中文文档 .
IMAP协议RFC3501中文文档 . 分类: 各类协议标准文档 2011-05-18 09:48 1238人阅读 评论(0) 收藏 举报 因特网邮件访问协议,版本4rev1(IMAP4rev1)允许 ...
- 动态划分VLAN的方法中不包括(23)。【答案】C
动态划分VLAN的方法中不包括(23). (23)A.网络层协议 B.网络层地址 C.交换机端口 D.MAC地址 [答案]C [解析] 在交换机上实现VLAN,可以采用静态的或动态的方法: ①静态分配 ...
- java 调用父级方法_java子类调用父类的方法中包含子类重写的实例方法
# 看题目是不是很绕,这个我也不知道怎么才能更简单的表达了 # 先看代码: public class Common { public static void main(String[] args) { ...
- C#方法中参数ref和out的解析
一.C#方法中参数类型 有4种参数类型,有时候很难记住它们的不同特征,下图对它们做一个总结,使之更容易比较和对照. 二.C#方法中的参数 1.值参数 使用值参数,通过复制实参的值到形参的方式把数据传递 ...
- 如何在返回String的Spring MVC @ResponseBody方法中响应HTTP 400错误?
本文翻译自:How to respond with HTTP 400 error in a Spring MVC @ResponseBody method returning String? I'm ...
最新文章
- mybatis-plus团队新作:mybatis-mate 轻松搞定数据权限
- 北京大学崔斌教授组招收图机器学习、AutoML等方向科研实习生
- 战略突破!又一国产芯片巨头即将追赶华为,成为思科的替代者?
- python输出数据到excel-python如何导出数据到excel文件
- 途牛网站无线架构变迁实践
- 用tolower()和toupper()来实现对string进行大小写转换
- php文件在桌面删除不了图片吗,删除windows桌面上某个应用程序的图标,意味着什么...
- 前端须知的 Cookie 知识小结
- 国产与第三方库FFmpeg SDK
- 利用JNative实现Java调用动态库
- GY的实验室 - Phalcon+Nginx+PHP-FPM环境搭建
- 《信息安全系统设计基础》实验一 开发环境的熟悉
- linux 环境下安装oracle11g方法及安装过程中遇上的问题解决方法
- python环境精简版_【Python专题(一)】Python环境搭建
- oppo9.0系统手机一键激活Xposed框架的步骤
- cf黑机器多久解除_[CF]黑机器码过无限提示一分钟强制踢出游戏的方法
- 气象台发布的拼图重投影示例
- 拓嘉辰丰电商:关于拼多多推广计划有哪些问题
- 7.2—查找—Sear Insert Position
- 硬件工程师成长之路(11)——职业规划
热门文章
- 《软件工程》总结——第一章
- leetcode. Intersection of Two Linked Lists
- objectC时间用法
- URLRewiter使用
- windows API 菜鸟学习之路(一)
- windows--bat--删除当前脚本del %0
- JAVA面试要点010---重入锁_ReentrantLock 详解
- android学习笔记---56_activity切换动画与页面切换动画,自定义activity窗口切换动画效果的实现.
- 读取图像到txt的程序
- c++ string详解 assign