【Swift4】一つのViewに複数のTableViewを配置する

# １．この記事でできること
一つのViewに複数のTableTableViewを配置して表示します。

# ２．バージョン
|Xcode|Swift|iOS|
|:--|:--|:--|
|10.1|4.2.1|12.1|

# ３．TableViewの配置
TableViewを複数配置します。
<img width="478" alt="スクリーンショット 2019-01-01 17.44.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/333779/0e16f5fc-4c3d-7092-0630-2a1a1842795e.png">

TableViewにTagを設定します。今回の例では、３つのTableViewに対して、上から0,1,2とTagを設定します。
<img width="378" alt="スクリーンショット 2019-01-01 17.47.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/333779/27bbc728-824e-106f-a3fa-9213b8ae94d6.png">

cellにもIdentifierを設定します。TableView同様に上から0,1,2と設定します。
<img width="705" alt="スクリーンショット 2019-01-01 18.19.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/333779/8bdb4b47-668c-9083-75f0-f06a1fbc8514.png">

# ４．コードの作成
## ４．１．Outlet接続と表示用データ
TableViewのOutlet接続と表示用データは下記のとおりです。（各変数名の0,1,2は、説明用にTagと合わせています。）
この後の処理で使用する分岐用の「tag」と「cellIdentifier」の定義もしています。
また、表示用データはTableView毎に配列を生成していますが、この後の処理のためそれらを配列にまとめています。

```ViewController.swift
    @IBOutlet weak var tableView0: UITableView!
    @IBOutlet weak var tableView1: UITableView!
    @IBOutlet weak var tableView2: UITableView!
    
    // 表示用データ
    var items0: NSMutableArray = ["ねずみ", "うし", "とら", "うさぎ"]
    var items1: NSMutableArray = ["りゅう", "へび", "うま", "ひつじ", "さる", "とり"]
    var items2: NSMutableArray = ["いぬ", "いのしし"]
    var items: [NSMutableArray] = []
    
    // 処理分岐用
    var tag:Int = 0
    var cellIdentifier:String = ""
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // デリゲートの設定
        tableView0.delegate = self
        tableView0.dataSource = self
        tableView1.delegate = self
        tableView1.dataSource = self
        tableView2.delegate = self
        tableView2.dataSource = self
        
        // 表示用データの配列を配列にする
        items.append(items0)
        items.append(items1)
        items.append(items2)
    }
```

## ４．２．テーブルビューの処理
テーブルビューの表示に関するコードは下記のとおりです。テーブルビューの処理内で分岐しても良いのですが、冗長的になるため、処理するTableViewをチェックするcheckTableViewメソッドを追加しています。
checkTableViewメソッド内で「tag」を利用して、処理対象のテーブルの情報を設定してあげた後、テーブルの表示処理を行います。

```ViewController.swift
    override func viewDidLoad() {
        （省略）
    }

    // 処理を分岐するメソッド
    func checkTableView(_ tableView: UITableView) -> Void{
        if (tableView.tag == 0) {
            tag = 0
            cellIdentifier = "cellIdentifier0"
        }
        else if (tableView.tag == 1) {
            tag = 1
            cellIdentifier = "cellIdentifier1"
        }
        else {
            tag = 2
            cellIdentifier = "cellIdentifier2"
        }
    }
    
    // MARK: - テーブルビュー
    // セルの数を返す。
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        checkTableView(tableView)
        
        return items[tag].count
    }
    
    // セルを返す。
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        checkTableView(tableView)
        
        // セルにテキストを出力する。
        let cell = tableView.dequeueReusableCell(withIdentifier:  cellIdentifier, for:indexPath as IndexPath)
        cell.textLabel?.text = items[tag][indexPath.row] as? String
        
        return cell
    }
    
    // テーブルビューをスワイプしてデータを削除する。
    func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
        let deleteButton: UITableViewRowAction = UITableViewRowAction(style: .normal, title: "削除") { (action, index) -> Void in
            self.checkTableView(tableView)
            self.items[self.tag].removeObject(at: indexPath.row)
            tableView.deleteRows(at: [indexPath], with: .fade)
        }
        deleteButton.backgroundColor = UIColor.red
        
        return [deleteButton]  
    }
```

## ４．３．補足
今回は、TableViewの特定のためにTagを使用しましたが、TableViewのisEqualメソッドでも代用できます。
こっちの方が変数名を直接指定してコードが書けるので、コードの視認性は良いと思います。
ただし、TableViewのTagを用いて、色々やったりすることもできそうなので、ケース・バイ・ケースで使い分けるのが良さそうです。

```ViewController.swift
    // 処理を分岐するメソッド
    func checkTableView(_ tableView: UITableView) -> Void{
        if (tableView.isEqual(tableView0)) {
            tag = 0
            cellIdentifier = "cellIdentifier0"
        }
        else if (tableView.isEqual(tableView1)) {
            tag = 1
            cellIdentifier = "cellIdentifier1"
        }
        else {
            tag = 2
            cellIdentifier = "cellIdentifier2"
        }
    }
```
# ５．実行イメージ
<img width="401" alt="スクリーンショット 2019-01-01 19.08.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/333779/bd311d2d-09c1-8c84-ce96-17546fbf8f91.png">
<img width="406" alt="スクリーンショット 2019-01-01 19.08.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/333779/8f8177db-6833-4d6c-d6fe-bdec92d6cfcb.png">
<img width="411" alt="スクリーンショット 2019-01-01 19.08.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/333779/1de2e093-dcc1-8f4f-5799-21ff89c890d2.png">