ストップウォッチのように経過時間を表示する機能を実装した時のメモ書きです。経過時間を表示するため、一定間隔で処理を繰り返す必要があったので、Timerを使って実装しました。

環境

  • Swift 3.1

Timerの使い方

タイマーの生成と開始

scheduledTimerでタイマーを生成し、開始することができます。

@IBAction func startTimer(_ sender: Any) {
    timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateElapsedTime), userInfo: nil, repeats: true)
}

指定できる引数は以下のとおり。

  • timeInterval: 実行間隔(秒)
  • target: タイマーで実行するメソッドを持っているインスタンス
  • selector: タイマーで実行するメソッド
  • userInfo: selectorで呼び出すメソッドに渡す情報
  • repeats: 繰り返し実行するかどうか
タイマーが動いている状態で、再度scheduledTimerを実行すると、二重でタイマーが生成されているのか、後述のinvalidateでタイマーを停止することができなくなります。

 タイマーの停止

invalidateでタイマーを停止することができます。

@IBAction func stopTimer(_ sender: Any) {
    timer.invalidate()
}
invalidateはタイマーを破棄するので、invalidate実行後にTimerのfireメソッドを実行しても処理を再開することはできません。

実装例

画面

サンプルアプリの画面

ソースコード

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var elapsedTime: UILabel!
    
    var timer: Timer = Timer()
    var count: Int = 0
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    //
    //  Startボタンの処理
    //
    @IBAction func startTimer(_ sender: Any) {
        
        //タイマーが動いている状態で押されたら処理しない
        if timer.isValid == true {
            return
        }
        
        //タイマーを生成
        timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateElapsedTime), userInfo: nil, repeats: true)
    }
    
    //
    //  Stopボタンの処理
    //
    @IBAction func stopTimer(_ sender: Any) {
        
        //タイマーを停止
        timer.invalidate()
    }
    
    //
    //  Resetボタンの処理
    //
    @IBAction func resetTimer(_ sender: Any) {
        timer.invalidate()
        count = 0
        elapsedTime.text = "00:00"
    }
    
    //
    //  一定間隔で実行される処理
    //
    func updateElapsedTime() {
        count += 1
        let min: Int = count / 60
        let sec: Int = count % 60
        elapsedTime.text = String(format:"%02d:%02d",min, sec)
    }
}