LoginSignup
0
4

More than 3 years have passed since last update.

UITableviewにCaseiterableとCustomStringConvertibleを使ってみる

Last updated at Posted at 2019-04-29

iOSエンジニアとして就職してから半年が経ちました、Swiftを初心者が半年間触って、とても便利に感じた一つの機能がProtocolです。
いくつもあるProtocolのなかで自分が特に便利に感じたものを紹介できたらと思いました

Protocolとは

・class、struct、enumに実装できる
・複数のprotocolを1つのclassへ実装できる
・処理を実装先で定義できるため、後からの変更が容易
・身近な例だとUITableViewDelegateやUITableViewDatasourceなど

定義

protocol ConvenienceProtocol{
    func convenienceFunc()
}

実装

class ConvClass: ConvenienceProtocol{
    func convenienceFunc(){
        //実態は実装先で定義する
    }
}

UITableviewにCaseiterableとCustomStringConvertibleを使ってみる

import UIKit

class TableViewController: UITableViewController{

    enum AnimalCellRows:Int, CustomStringConvertible, CaseIterable{
        case nekochan 
        case dog
        case bird

        var description: String {
            switch self {
            case .nekochan:     return "nekochan"
            case .dog:          return "dog"
            case .bird:         return "bird"
            }
        }  
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell()
        cell.textLabel?.text = {
            switch indexPath.row{
            case AnimalCellRows.nekochan.rawValue:      return AnimalCellRows.nekochan.description
            case AnimalCellRows.dog.rawValue:           return AnimalCellRows.dog.description
            case AnimalCellRows.bird.rawValue:          return AnimalCellRows.bird.description
            default: break                                           
            }
            return ""
        }()
        return cell
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return AnimalCellRows.allCases.count
    }
}

CaseIterableを使うことによってenumのcountを取得できるようになり、CustomStringConvertibleを使うことによりenumの値とは別にtitleを定義できました

最後に

UITableViewをenumで管理したら便利なのではと思い使っていたのですが、enumだけですとcountが取れなかったり、cellのtextを直接入力しないといけなくて困っていたのですが、CaseiterableとCustomStringConvertibleを知り、変更があってもenum内だけで完結できるようになりました。
画像などを表示したい場合はCustomStringConvertibleをstructに変えて見るといいかもしれません

0
4
4

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
0
4