WWDC2018で新しくCaseIterable
というProtocolが発表されたので
実際にどのような場合に便利か自分なりに考えた
UITableViewをenumで管理しやすいのでは…?
やってみた
下記Delegate周りのコード
MenuViewController.swift
extension MenuViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return Menu.allCases.count //ココ!!!
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let menu = Menu(rawValue: indexPath.row) else { return UITableViewCell() }
guard let cell = tableView.dequeueReusableCell(withIdentifier: "MenuCell", for: indexPath) as? MenuTableViewCell else { return UITableViewCell() }
cell.titleLabel.text = menu.info.title
cell.metaImage.image = menu.info.image
cell.contentView.backgroundColor = menu.info.color
return cell
}
}
下記Cellの情報を管理するenum
CellがタップされたDelegateで、定義したMenuData
を初期化。
Cellの内容を保持させたMenuData
をinfo
として返却する
MenuViewController.swift
enum Menu: Int, CaseIterable {
case history
case chat
case setting
struct MenuData {
var title: String
var image: UIImage?
var color: UIColor
var segue: String
}
var info: MenuData {
switch self {
case .history:
let menuData = MenuData(title: "History",
image: UIImage(named: "History"),
color: UIColor(red: 46/255, green: 204/255, blue: 113/255, alpha: 1),
segue: "toHistoryViewController")
return menuData
case .chat:
let menuData = MenuData(title: "Chat",
image: UIImage(named: "Chat"),
color: UIColor(red: 241/255, green: 196/255, blue: 15/255, alpha: 1),
segue: "toChatViewController")
return menuData
case .setting:
let menuData = MenuData(title: "Setting",
image: UIImage(named: "Setting"),
color: UIColor(red: 149/255, green: 165/255, blue: 166/255, alpha: 1),
segue: "toSettingViewController")
return menuData
}
}
}
またこのMenu
はCaseIterable
に準拠しているので
Menu.allCases.count
でenumのcaseの個数が取得可能。これをセルの個数に指定する
まとめ
UITableViewCell
を返すDelegateメソッドはコード量が増えがちだがenumで管理してあげれば
比較的スマートに書けるし今回のCaseIterable
でCellの個数が返せます。