Button

Swift

タイマー機能

struct ContentView: View {
    @State private var randomNumber = 1
    @State private var timer: Timer?
    @State private var isRolling = false

    var body: some View {
        VStack {
            Image(systemName: "die.face.\(randomNumber)")
                .resizable() <--- 画像のサイズを変えるために必要です
                .scaledToFit() <--- 画像の比率を固定します
                .frame(width: UIScreen.main.bounds.width/2)
                .padding()
            Button {
                playDice()
            } label: {
                Text("サイコロをふる")
                    .padding()
                    .background(Color.orange)
                    .foregroundColor(.black)
                    .cornerRadius(10)
            }
            .disabled(isRolling) <--- サイコロが回転している最中はボタンを押せないようにします
        }
        .padding()
    }

    private func playDice() {
        isRolling = true <--- 一旦trueにしてボタンを押せないようにします

        timer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { _ in
                    randomNumber = Int.random(in: 1...6) <--- ランダムな数字を生成
        }
                
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
            timer?.invalidate() <--- 0.5秒後にサイコロを止めます
            timer = nil
            isRolling = false <--- ボタンを押せるようにします
        }
    }
}

リファクタリング…挙動は変えずに、プログラムの内部構造を整理して、スッキリさせること

今回はButton{}内のコードをfunc playDiceに関数化させることでリファクタリングしました

BACK