[Swift3]簡易ストップウォッチを作る

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る
Swift

Timerクラスを使用した、簡易的なストップウォッチを作成する。

ラップ機能は実装していないが、Start/Stop/Resetボタンにより1/100秒単位での時間の計測を行うことができる。

今回作るもの

実装する機能は以下の通りである。

  • 時間を1/100秒単位で計測する
  • Stopボタンを押して再度Startボタンを押した場合、続きの時間から計測する
  • 表示は分・秒・コンマ秒まで
  • ラップ機能は搭載しない
  • ストップウォッチの作動状態により、ボタンの活性・非活性を切り替える

実行イメージはこのような感じ。

変数の準備・アウトレット接続

使用するUI部品は、タイムを表示するラベル・Start/Stop/Resetボタン。それぞれをアウトレット接続しておく。

また、タイマー処理に関わる変数を宣言しておく。

ボタンを押した時の動作

ボタンの活性・非活性の切り替わり方

Start/Stop/Resetボタンは、ストップウォッチが作動しているかしていないかで活性/非活性を切り替える。

  • ストップウォッチ作動中は、Stopボタンを活性、Start/Resetボタンを非活性にする
  • ストップウォッチ停止中は、Start/Resetボタンを活性、Stopボタンを非活性にする

経過時間の計算方法

ただ単にラベルに表示するタイムを「Startボタンが押されてから経過した時間」とすると、一度Stopボタンを押してから再度Startボタンを押した時に正しいタイムが表示されない。

この問題に対処するため、タイムの測定は以下のような処理で実現する。

  • Startボタンが押されたら、Startボタンを押した時間を記録し、現在の時刻との差をラベルに表示する
  • Stopボタンが押されたら、タイマー処理を中断し、これまでに経過した時間を変数に保持しておく
  • Resetボタンが押されず再度Startボタンが押された場合、Startボタンを押した時間を上書きし、現在の時刻との差に変数に保持した経過時間を足した時間をラベルに表示する
  • 変数に保持した経過時間は、Resetボタンが押されたら0に戻す

Startボタンの処理

各種ボタンの活性・非活性を切り替え、タイマー処理を登録する。

タイマー処理で呼び出される処理は以下のように実装する。

ちなみに筆者は当初「0.01秒ごとにラベルを0.01秒ずつ増やしていけばいいんでないの?」と思っていたが、残念ながら処理の重さのために0.01秒ごとに処理を行うように指定しても実際はもっと長い間隔で処理が行われる

そのため上記の処理のように「処理が呼び出されるたびに、その時点で経過している時間を表示」としないと、とてもポンコツなストップウォッチが完成してしまう。(見てて面白いので一度試してみてほしい)

Stopボタンの処理

Stopボタンが押されたら、ボタンの活性・非活性の切り替え、タイマー処理の停止、経過時間の保存を行う。経過時間を保存することにより、再びStartボタンが押されても継続して時間を計測することができるようになる。

Resetボタンの処理

経過時間のリセット、ラベルの初期化を行うだけである。

完成したソース

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

SNSでもご購読できます。