Swift

UITalbeViewのスケルトン

class ViewController: UIViewController {

    fileprivate lazy var tableView: UITableView = {
        let t = UITableView()
        t.delegate = self
        t.dataSource = self
        t.frame = view.bounds
        t.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
        return t
    }()

    fileprivate var model: [String] {
        return (0..<20).map { "cell \($0)" }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(tableView)
    }
}

extension ViewController: UITableViewDelegate {

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("tap \(indexPath)")
    }
}

extension ViewController: UITableViewDataSource {


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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = model[indexPath.row]
        return cell
    }
}

delegateとは

あるクラスの処理を他のクラスに移譲します。
この例ではSomeView(カスタムViewのつもり)にあるsomebuttonが押された時の処理を
実際にSomeViewが使われるSomeViewControllerに書くことができます。

protocol SomeViewDelegate {
    func onClickButton(_ sender: UIButton)
}

class SomeView: UIView {

    var delegate: SomeViewDelegate?

    @objc private func buttonTouchUpInside(_ sender: UIButton) {
        self.delegate?.onClickButton(sender)
    }

    @IBOutlet var someButton: UIButton! {

        didSet {
            someButton.addTarget(self, action: #selector(buttonTouchUpInside), for: .touchUpInside)
        }
    }
}
class SomeViewController: UIViewController {

    override func viewDidLoad() {

        let someView = SomeView()
        someView.delegate = self
    }
}

extension SomeViewController: SomeViewDelegate {

    func onClickButton(_ sender: UIButton) {

    }
}

初めてアプリ作ったころUITableViewDelegateってなんだしって思いました。

tableViewの場合はtableViewのセルの高さやセルがクリックされた時のメソッドを別の(UITableView)じゃないクラスで書くことができる。

すごい簡単なことなのにわかりにくい・・・