第23回 クラスの設計は難しいです!
スクロールビューまで来て、はたと困りました。
なぜなら、思いつくままにプログラムを書く癖があるので、後になってここはどうしようかと考えてしまうから。
で、困った原因はというと、Runnerクラスってこのアプリの中心的存在なのに、いちいち消したり、ファイルから呼び出したりするもの?って疑問に思えたからなんです。
最初にこのクラスをListにしておいて、エントリーするときや、計測するときはこのリストを渡してしまえばいいんじゃないかって思ったんですよね。
だいたい、メニューを行き来する間に消えてしまうクラスにデータを保持させておくのは効率が悪いですよね?
なので、スタティックなRunnerクラスを束ねたRunnerListを作るのがいいんじゃないかと思い、作ってみようかと思います。
まずいことに、スクロールビューに並べているオブジェクトに Runner と名前をつけているので、まず、これを RunnerEntryView とRenameしておきます。
Refacter - Rename どちらにもありますね。まあ、あるのが普通なんでしょうけど。
さて、こんなクラスのイメージですが・・・
import UIKit class Runner { let myNumber: Int private var myName: String var entry: Bool = false var lap: Int = 0 private var time: [Int] // タイムは100倍して切り捨て init(number: Int) { myNumber = number myName = "" time = [] } // 名前セッター・ゲッター func setName(name: String) { myName = name } func getName() -> String { return myName } // ラップデータの処理 func setLapTime(rapTime: Float) { // 100倍して整数化 let time100 = Int(rapTime*100) time.append(time100) lap += 1 // ラップ数をカウント } // ラップボタン func LapButton(frame: CGRect) -> UIButton { let lapButton: UIButton = UIButton(frame: frame) lapButton.setTitle(myName, for: .normal) return lapButton } // エントリー用のビュー func EntryView(frame: CGRect) -> RunnerEntryView { let entryView: RunnerEntryView = RunnerEntryView(frame: frame, number: myNumber) return entryView } }
最後にある関数はスクロールビューに乗っけたものを、このクラスのメンバーとして返すように作り直そうと思っている物です。こうしておくと、名前も入れやすいし、便利なのではないかと。
もう一つのラップボタンの処理は、タイムを記録するのもこの Runner クラスなのかな?と思いながら、とりあえず UIButton を返す関数として作っています。
このボタンの挙動はこのクラスに書くべきなんでしょう。きっと。