Timer(Swift4.2.1)



簡易的なタイマーを開発してみました。

下の画像は起動後の画面です。

<img width="353" alt="スクリーンショット 2019-02-24 21.48.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/367052/b3f9fae3-b682-ecf6-6936-385fb8e1e97d.png">

スタートを押すとカウントが始まります。

ストップを押すとカウントが止まります。

下の画像はタイマーが0になった時の表示です。


<img width="353" alt="スクリーンショット 2019-02-24 21.48.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/367052/76ccb27f-587c-6711-f5f2-ef9a002530e6.png">


この画面上でのコードをまず記述します。



```

import UIKit

class ViewController: UIViewController {

    var timer : Timer?
    
    var count=0
    
    let settingKey="timer_value"
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let settings=UserDefaults.standard
        
        settings.register(defaults: [settingKey : 10])
    }
    @IBOutlet weak var countDownLabel: UILabel!
    
    @IBAction func settingButtonAction(_ sender: Any) {
        
        if let nowTimer = timer{
            
            if nowTimer.isValid==true{
                
                nowTimer.invalidate()
            }
        }
        performSegue(withIdentifier: "goSetting", sender: nil)
    }
    @IBAction func startButtonAction(_ sender: Any) {
        
        if let nowTimer = timer {
            
            if nowTimer.isValid==true{
                
                return
            }
        }
        
        timer=Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(self.timerInterrupt(_:)), userInfo: nil, repeats: true)
    }
    @IBAction func stopButtonAction(_ sender: Any) {
        if let nowTimer=timer{
            
            if nowTimer.isValid==true{
                nowTimer.invalidate()
            }
        }
    }
    
    func displayUpdate() -> Int {
        
        let  settings = UserDefaults.standard
        
        let timerValue=settings.integer(forKey: settingKey)
        
        let remainCount=timerValue - count
        
        countDownLabel.text="残り\(remainCount)秒"
        
        return remainCount
        
    }
    
    @objc func timerInterrupt(_ timer:Timer){
        
        count += 1
        
        if displayUpdate() <= 0 {
            
            count=0
            
            timer.invalidate()
            
            let alertController=UIAlertController(title: "終了", message: "タイマー終了時間です", preferredStyle: .alert)
            
            let defaultAction = UIAlertAction(title:"OK",style: .default,handler:nil)
            
            alertController.addAction(defaultAction)
            
            present(alertController, animated: true, completion: nil)
        }
    }
    override func viewDidAppear(_ animated: Bool) {
        
        count=0
        
        _ = displayUpdate()
    }
}

```


次は秒数設定の画面です。

<img width="353" alt="スクリーンショット 2019-02-24 21.48.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/367052/6ca68b8e-6fb1-8798-23e5-fe44c70d0685.png">


ここでタイマーの秒数を決めます。

秒数設定画面のコードを記述します。


```
import UIKit

class SettingViewController: UIViewController ,UIPickerViewDataSource,UIPickerViewDelegate{
    

    let settingArray : [Int]=[10,20,30,40,50,60]
    
    let settingKey="timer_value"
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        
        timerSettingPicker.delegate=self
        
        timerSettingPicker.dataSource=self
        
        let settings=UserDefaults.standard
        let timeValue=settings.integer(forKey:settingKey)
        
        for row in 0..<settingArray.count{
            if settingArray[row]==timeValue{
                timerSettingPicker.selectRow(row, inComponent:0, animated:true)
            }
        }
        
    }
    

    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destination.
        // Pass the selected object to the new view controller.
    }
    */
    @IBOutlet weak var timerSettingPicker: UIPickerView!
    @IBAction func decisionBUttonAction(_ sender: Any) {
        _ = navigationController?.popViewController(animated: true)
    }
    
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }
    
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return settingArray.count
    }
    
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return String(settingArray[row])
    }
    
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        let settings = UserDefaults.standard
        settings.setValue(settingArray[row],forKey:settingKey)
        settings.synchronize()
    }
}
```

以上です。有難うございました。