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に変えて見るといいかもしれません