クリスマス終了までをカウントダウンしたい

この記事は クソアプリ2 Advent Calendar 2020 の25日目の投稿です。
昨日は[@inabajunmr](https://inabajunmr.hatenablog.com/entry/2020/12/17/205750)さんの「ここにタイトルを入れます」でした。

#はじめに
今回初めてQiita アドベントカレンダーに参加しました。
去年や一昨年のアドベントカレンダーの「クソアプリ」の参加者の方の記事を読みましたが、とても楽しそうでした。
僕も今回楽しみたいと思います。

#今回作ったもの
クリスマス終了までをカウントダウンするアプリです。（スクリーンショットの画像はイメージがしやすいように別の日付を設定しています）
![スクリーンショット 2020-12-06 11.22.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683624/9e4d1c45-f83c-7433-5ae4-286952c8eac4.png)


#作ろうと思った経緯
このアプリを作ろうと思った経緯は、私が初心者なので勉強した事で「クソアプリ」を作ろうと思いました。
今回ちょうど、タイマーについて学んでいました。
そこで「タイマー機能」と「プログレスバー」を使ったアプリを作ろうと思いました。

#story boardにLabelなどを配置
![スクリーンショット 2020-12-06 14.16.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683624/d897fce2-12c5-b2ff-f90c-a524689f2f23.png)

#タイマーの設定とLabelに時間を表示

```swift
let futureDate: Date = {
        var future = DateComponents(
            year: 2020,
            month: 12,
            day: 25, 
            hour: 0,
            minute: 0,
            second: 0
        )
        return Calendar.current.date(from: future)!
    }()
    
    var countdown: DateComponents {
        //２つの指定された日付けの差を返す
        return Calendar.current.dateComponents([.day, .hour, .minute, .second], from: Date(), to: futureDate)
    }
    
    //カウントダウンされている「時間」「分」「秒」が表示される
    @objc func updateTime() {
        let countdown = self.countdown
        let hours = countdown.hour!
        let minutes = countdown.minute!
        let seconds = countdown.second!
        
        timeLabel.text = String(hours)
        minutesLabel.text = String(minutes)
        secondsLabel.text = String(seconds)
    }
    
    func runCountdown() {
        Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateTime), userInfo: nil, repeats: true)
    }
```

#progressBarに値を入れ、バーと%を表示する

```swift
runCountdown()
        
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        let startDate = formatter.date(from: "2020-12-24 00:00:00")!
        
        //現時刻と2020年12月25日との時間の差
        let duration = formatter.date(from: "2020-12-25 00:00:00")?.timeIntervalSinceNow
        //絶対値に変換
        let durationFabs = fabs(duration!)
        //少数点以下四捨五入
        let durationRound = round(durationFabs)
        
        //2020年12月24日から2020年12月25日までのトータル時間
        let elapsed = formatter.date(from: "2020-12-25 00:00:00")?.timeIntervalSince(startDate)
        
        //パーセンテージを出す
        let percentage = (durationRound / elapsed!) * 100
        let percentageBarProgress = 1 - (durationRound / elapsed!)
        
        
        let percentageInteger = (round(100 * 10) / 10) - (round(percentage * 10) / 10)
        
        progressBar.progress = Float(percentageBarProgress)
        
        percentLabel.text = String("\(round(percentageInteger * 100) / 100) %")
        
        print(durationRound)//今現在と指定した時間との差の秒が表示される
        print(elapsed!)
        print(percentageInteger)
        print(percentageBarProgress)
```

#難しかった点
難しかった点は２つありました。
①１２月２５日(現時点での時間)から１２月２６日までの差分をどのように出せば良いかわからなかった点。

１日のトータル時間を出しました。

```swift
 let elapsed = formatter.date(from: "2020-12-25 00:00:00")?.timeIntervalSince(startDate)
```

２５日０時００分からどれくらい時間が経過したかの値を取得しました。

```swift
 //現時刻と2020年12月26日との時間の差
        let duration = formatter.date(from: "2020-12-26 00:00:00")?.timeIntervalSinceNow
        //絶対値に変換
        let durationFabs = fabs(duration!)
        //少数点以下四捨五入
        let durationRound = round(durationFabs)
```

現在まで経過した時間　/ １日のトータル時間　* 100 でパーセントを出しました。

```swift
//パーセンテージを出す
        let percentage = (durationRound / elapsed!) * 100
```

今日の残りの時間を出す為に１から引きます（パーセントにしていない100をかけていない値を使います）

```swift
let percentageBarProgress = 1 - (durationRound / elapsed!)
```

②Labelに残りの%表示で小数点１まで表示する方法がわからなかった点。
小数点以下の表示をする時は、小数点第２位四捨五入は下記のようにする。

```swift
 let percentageInteger = (round(100 * 10) / 10) - (round(percentage * 10) / 10)
```

Labelに小数点第１位まで表示する場合は、10 / 10 　ではなく　100 / 100　を使用します。

```swift
 percentLabel.text = String("\(round(percentageInteger * 100) / 100) %")
```

小数点表示に関しては、手を動かしていたら出来た感じなので、もう少し理解を深めないといけないと感じています。

#終わりに
今回初めてアドベントカレンダーに参加をしました。
なかなか、このような機会がないと学びをアウトプットする機会はありません。
このような素敵な発表の場を作っていただき、ありがとうございました。

みなさんのような、素敵なクソアプリは作れませんでしたが、とても楽しかったです。

これからもSwiftの勉強に励みたいと思います。

[twitter](https://twitter.com/koara1237)