CustomCellのOptionButtonでCellの削除をする!!

# はじめに
CustomCellを任意のUIButtonでCellの削除を実装したいと思い、やっとの思いで試行錯誤して実装する事が出来たため、備忘録的にまとめておきます。

## 1.コード全文表記
```Swift:ViewControler
import UIKit

class ViewController: UIViewController {
    
    var itemArray = ["cell 1","cell 2","cell 3"]
    
    @IBOutlet weak var tableView: UITableView!
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.register(UINib(nibName: "TableViewCell", bundle: nil), forCellReuseIdentifier: "customCell")
        tableView.delegate = self
        tableView.dataSource = self
    }
}

extension ViewController: UITableViewDelegate,UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        itemArray.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "customCell",for: indexPath) as! TableViewCell
        cell.content.text = itemArray[indexPath.row]
        //indexPathRowをindexPath.rowと紐づけ
        cell.indexPathRow = indexPath.row
        //忘れやすいので注意する
        cell.delegate = self
        return cell
    }
}
extension ViewController: TableViewCellDelegate {
    
    func deleteButton(indexPathRow: Int) {
        //indexPathの作成
        let indexPath = IndexPath(row: indexPathRow, section: 0)
        //アラートアクションの設定
        let alert: UIAlertController = UIAlertController(title: "注意", message: "削除してもいいですか？", preferredStyle: .alert)
        let canselAction: UIAlertAction = UIAlertAction(title: "キャンセル", style: .cancel) { (UIAlertAction) in
            print("キャンセル")
        }
        let okAction: UIAlertAction = UIAlertAction(title: "削除", style: .destructive) { (UIAlertAction) in
            //itemArrayの削除
            self.itemArray.remove(at: indexPathRow)
            //tableViewをアニメーション付きで削除
            self.tableView.deleteRows(at: [indexPath], with: .automatic)
            //tableViewのリロード
            self.tableView.reloadData()
            
        }
        alert.addAction(okAction)
        alert.addAction(canselAction)
        present(alert, animated: true, completion: nil)
    }
}
```
```Swift:TableViewCell
import UIKit

protocol TableViewCellDelegate {
    func deleteButton(indexPathRow: Int)
}

class TableViewCell: UITableViewCell {
    //TableViewCellDelegate型の変数delegateを宣言する。
    var delegate: TableViewCellDelegate?
    var indexPathRow = 0
    
    @IBOutlet weak var content: UILabel!
    @IBAction func deleteButton(_ sender: Any) {
        delegate?.deleteButton(indexPathRow: indexPathRow)
    }
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }
    
    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
        // Configure the view for the selected state
    }
}
```

## 2.各アイテムの紐付け
CustomCellは今回はUIImage,UILabelを使っています。今回はコメント入力欄にitemArrayを表示させたいので、contentとして紐付けます。
CustomCellの作成はhttps://qiita.com/masasumi0327/items/f01e764a2f4a29a8afa5
をご覧になって下さい!!

![ezgif.com-gif-maker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2428088/aabf75d9-e223-d1ba-e4bb-eca029915ae5.gif)
![ezgif.com-gif-maker (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2428088/46fe40e5-4b93-853f-a7e1-be3a3b25a320.gif)

## 3.ビルド開始!

![ezgif.com-gif-maker (3).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2428088/fc58217d-0355-5768-3572-f134ca5beeba.gif)

## 4.実装の説明
まずTableViewCell.swift内でTableViewCellDelegateプロトコルを宣言します。
```swift:TableViewCell
protocol TableViewCellDelegate {
    func deleteButton(indexPathRow: Int)
}
```

このプロトコルをViewControllerに継承する事でプロトコル内のdeleteButton(indexPathRow: Int)をViewControllerで使用することが出来ます。
またTableViewCellクラス内でTableViewCellDelegate型の変数delegateを宣言,そして変数indexPathRowを宣言しておきます。
```swift:TableViewCell
var delegate: TableViewCellDelegate?
var indexPathRow = 0
```

そしてViewController内での
```swift:ViewController
cell.delegate = self
```
なのですが、このコードの意味が私にはよくわからずに、とても苦戦しました。
噛み砕いて説明すると、
**TableViewCellクラスにあるdelegateをselfであるViewControllerでも使用できる**ように定義してます。
**ViewController(私)でも変数delegateを使用出来ますよ。**・・・という意味です。
これはUITableViewを使用する際にお約束となっている、
```Swift:ViewController
tableView.delegate = self
tableView.dataSource = self
```
も同じ考え方でOKです!!
ちなみにUITableViewDelegateを(Command ＋　Control)を押しながら左クリックしていくと・・・
```swift
public protocol UITableViewDelegate : UIScrollViewDelegate
```
に辿り着きます。
UITableViewDelegateプロトコルのメソッドを使用するために変数delegateを使って、ViewController(self)でも使用できるようにしているのですね。

そしてViewController内でdeleteButtonメソッドを実行する・・・という流れです。

# さいごに
今回の機能を実装するのには初心者の私にはとても難しかったです。
しかし、試行錯誤を続けていくなかでdelegateの考え方を理解する事が出来ましたので、
とてもいい勉強になったと思っています。

同じような壁にぶち当たった方もいるのではないかと思いますので、この記事で少しでも手助け出来れば幸いです。
以上となります。