LoginSignup
14
16

More than 5 years have passed since last update.

UITableViewをenumとCaseIterableで管理してみる

Posted at

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の内容を保持させたMenuDatainfoとして返却する

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
        }
    }
}

またこのMenuCaseIterableに準拠しているので

Menu.allCases.count

でenumのcaseの個数が取得可能。これをセルの個数に指定する

まとめ

UITableViewCellを返すDelegateメソッドはコード量が増えがちだがenumで管理してあげれば
比較的スマートに書けるし今回のCaseIterableでCellの個数が返せます。

14
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
16