LoginSignup
3
0

はじめに

2024年、あけましておめでとうございます。年越しに作ったカウントダウンアプリが成功したので、記念に記録しようと思います。

開発環境

Xcode Version 15.1

作品の概要

年を越すまでカウントダウンし、カウントダウンが00:00:00になったらイラストが今年のものになり、HappyNewYearが表示されるといったシンプルなものです。
image.png

コード全文


import SwiftUI

struct ContentView: View {
    @State private var countdown: String = ""
    @State private var isCountdownFinished: Bool = false
    
    var body: some View {
        VStack {
                  if isCountdownFinished {
                      Image("dragon")
                          .resizable()
                          .scaledToFill()
                          .frame(width: 250, height: 250)
                      Text("Happy New Year!!")
                          .padding()
                  } else {
                      Image("rabbit")
                          .resizable()
                          .scaledToFill()
                          .frame(width: 250, height: 250)
                      Text("2024年まであと \(countdown)")
                          .padding()
                          .onAppear(perform: startCountdown)
                  }
                  
              }
              .onChange(of: countdown) { newValue in
                  if newValue == "00:00:00" {
                      isCountdownFinished = true
                  }
              }
              .onChange(of: isCountdownFinished) { newValue in
                  if newValue {
                      Text("Happy New Year!")
                          .font(.largeTitle)
                          .padding()
                          .foregroundColor(.red)
                  }
              }
          }

    func startCountdown() {
        let calendar = Calendar.current
        // ターゲットの時刻設定
        let targetDateComponents = DateComponents(year: 2024, month: 1, day: 1)
        let targetDate = calendar.date(from: targetDateComponents)! // Date()に型を合わせる
        
        // カウントダウン(1秒ごとに発火)
        let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) {
            timer in
            // 現在時刻の取得
            let currenDate = Date()
            // 残り時間のコンポーネントを作成
            let components = calendar
                // 秒未満を切り捨て
                .dateComponents([.hour, .minute, .second],
                // 差分を計算
                from: currenDate, to: targetDate)
            // hour, minute, secondsがnilでないことを確認
            if let hours = components.hour, let minutes = components.minute, let seconds = components.second {
                //formatする
                countdown = String(format: "%02d:%02d:%02d", hours, minutes, seconds)
            }
        }
        timer.tolerance = 0.1
        timer.fire()
    }
}

#Preview {
    ContentView()
}

最後に

今年もプログラミング頑張ります。よろしくお願いします。みなさんの一年が良いものとなりますように。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0