Button
タイマー機能
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