📖

【学習備忘録】delegateを使ったCounterアプリ

2022/05/18に公開

はじめに

「比較して学ぶ RxSwift4 入門」のCounterアプリのコードをもとに学習しました。
比較材料であるdelegateを使ったCounterアプリです。

サンプルコード

完成

1. CounterDelegate

  • プロトコルでcountをアップデートするメソッドを定義。
protocol CounterDelegate {
    func updateCount(count: Int)
}

2. CounterPresenter

  • countの数字が変更されるとupdateCountが呼ばれるようにプロパティをかく。
  • attachViewでViewControllerと接続するためのメソッドを記載。
  • それぞれに対応する処理(カウントアップ・ダウン・リセット)を記載。
class CounterPresenter {
    private var count = 0 {
        didSet {
            delegate?.updateCount(count: count)
        }
    }

    private var delegate: CounterDelegate?

    func attachView(_ delegate: CounterDelegate) {
        self.delegate = delegate
    }

    func detachView() {
        self.delegate = nil
    }

    func incrementCount() {
        count += 1
    }

    func decrementCount() {
        count -= 1
    }

    func resetCount() {
        count = 0
    }
}

3. ViewController

  • viewDidLoad()内でattachView()を呼ぶ。selfでViewController自身を指し示す。
  • extentionでupdateCount()の処理(変更を画面に反映させる)を記載。
  • @IBAction内でそれぞれに対応する処理を記載。
class ViewController: UIViewController {

    @IBOutlet weak var countLabel: UILabel!

    private let presenter = CounterPresenter()

    override func viewDidLoad() {
        super.viewDidLoad()
        presenter.attachView(self)
    }

    @IBAction func countUp(_ sender: Any) {
        presenter.incrementCount()
    }

    @IBAction func countDown(_ sender: Any) {
        presenter.decrementCount()
    }

    @IBAction func resetCount(_ sender: Any) {
        presenter.resetCount()
    }
}

extension ViewController: CounterDelegate {
    func updateCount(count: Int) {
        countLabel.text = String(count)
    }
}

GitHub

https://github.com/MasakatsuTagishi/Practice-Delegate-CounterApp

参考にしたもの

1.比較して学ぶRxSwift入門

https://www.amazon.co.jp/比較して学ぶRxSwift入門-技術の泉シリーズ(NextPublishing)-髙橋-凌-ebook/dp/B07LGMNXS3

さいごに

シンプルなアプリでは、RxSwiftを使うよりもこのようなコードのかき方の方が圧倒的にわかりやすいと感じました。
間違いや認識違いがあれば指摘いただければ幸いです。

Discussion