Swift中如何用Case优化TableView多XIB Cell的复用逻辑?
用Switch语句重构UITableView的多Cell复用
嘿,完全懂你这种一堆if判断堆在一起的糟心感——用switch语句来重构不仅更清晰,后续维护起来也方便太多!
首先,先确保你已经在viewDidLoad里完成了所有XIB Cell的注册(这步很重要,不然复用会出问题):
override func viewDidLoad() { super.viewDidLoad() // 注册各个Cell的XIB tableView.register(UINib(nibName: TableViewCellOne.identifier, bundle: nil), forCellReuseIdentifier: TableViewCellOne.identifier) tableView.register(UINib(nibName: TableViewCellTwo.identifier, bundle: nil), forCellReuseIdentifier: TableViewCellTwo.identifier) }
接下来就是把原来的if判断换成switch的核心代码,直接替换你原来的cellForRowAt逻辑:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { switch indexPath.row { case 0: let cell = tableView.dequeueReusableCell(withIdentifier: TableViewCellOne.identifier, for: indexPath) as! TableViewCellOne // 这里可以添加CellOne的配置逻辑,比如cell.titleLabel.text = "xxx" return cell case 1: let cell = tableView.dequeueReusableCell(withIdentifier: TableViewCellTwo.identifier, for: indexPath) as! TableViewCellTwo // 同理配置CellTwo return cell default: // 默认返回一个空Cell,或者根据需求处理越界情况 return UITableViewCell() } }
额外优化小建议
如果后续Cell类型越来越多,还可以把row和对应Cell的映射逻辑抽成一个枚举,让代码扩展性更强:
enum CellType: Int { case one = 0 case two = 1 var identifier: String { switch self { case .one: return TableViewCellOne.identifier case .two: return TableViewCellTwo.identifier } } }
然后在cellForRowAt里就可以写成:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { guard let cellType = CellType(rawValue: indexPath.row) else { return UITableViewCell() } switch cellType { case .one: let cell = tableView.dequeueReusableCell(withIdentifier: cellType.identifier, for: indexPath) as! TableViewCellOne // 配置Cell return cell case .two: let cell = tableView.dequeueReusableCell(withIdentifier: cellType.identifier, for: indexPath) as! TableViewCellTwo // 配置Cell return cell } }
这样后续新增Cell类型的时候,只需要扩展枚举就行,代码的可维护性直接拉满!
内容的提问来源于stack exchange,提问作者jojiReptiloid
相关产品推荐
相关产品推荐

