Переключение bool свойства по истечению таймера

Пишу приложения для игры, в игровом view есть кнопка "переворачивания" карточки с вопросом, есть кнопки принятия ответа и нарушения, при нажатии на которые происходит переворачивание карточки, так же есть таймер, проблема заключается в том, что не могу понять, как по истечению времени таймера, переключить bool свойство для переворачивания карточки обратно...

Сама модель таймера

import Foundation

class TimerManager : ObservableObject {

//Свойство режима таймера
@Published var timerMode : TimerMode = .initial
//Свойство количества секунд
@Published var leftSeconds = UserDefaults.standard.integer(forKey: "timerLenght")

var timer = Timer()
//Метод выборки времени для таймера (Возможно позже доделаю)
func setTimerLenght(minutes: Int) {
    let defaults = UserDefaults.standard
    defaults.setValue(minutes, forKey: "timerLenght")
    leftSeconds = minutes
}
//Метод запуска таймера
func start() {
    timerMode = .running
    timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true, block: { timer in
        if self.leftSeconds == 0 {
            self.reset()
        }
        self.leftSeconds -= 1
    })
}
//Метод перезапуска таймера
func reset() {
    self.timerMode = .initial
    self.leftSeconds = UserDefaults.standard.integer(forKey: "timerLenght")
    timer.invalidate()
}
//Метод остановки таймера
func pause() {
    self.timerMode = .paused
    timer.invalidate()
    }
}

 //Режимы работы таймера
 enum TimerMode {
      case running, paused, initial
}

//Конвертирование времени
func secondsToMinutesAndSeconds(seconds: Int) -> String {
let minutes = "\((seconds % 3600) / 60)"
let seconds = "\((seconds % 3600) % 60)"
let minutesStamp = minutes.count > 1 ? minutes : "0" + minutes
let secondsStamp = seconds.count > 1 ? seconds : "0" + seconds

return "\(minutesStamp) : \(secondsStamp)"
}

Игровое View

struct EasyDifficultyView: View {

//Свойство привязки для определения стороны карточки
@State private var flipped : Bool = false
//Свойство привязки для вращения карточки в градусах
@State private var degrees : Double = 180

//Свойства привязки высоты и ширины карточки
@State private var width : CGFloat = 350
@State private var heigh : CGFloat = 230

//Свойство привязки к модели таймера
@ObservedObject var timeManager = TimerManager()
let availableMinutes = 1

 var body: some View {
    
       ZStack {

            VStack {

            //Таймер и его внешний вид с кнопкой включения, текущий игрок
            VStack(spacing: 15) {
                
                
                
                if teams.teamsArray.count > teamIndex {
                    Text("Ваша очередь! \(teams.teamsArray[teamIndex].name)")
                        .font(.custom("coolJazz", size: 30))
                }
                 
                if timeManager.timerMode == .running {
                    Text(secondsToMinutesAndSeconds(seconds: timeManager.leftSeconds))
                        .font(.custom("coolJazz", size: 40))
                }

           }.padding(.top, 50)
            
           Spacer()

           //Две стороны карточки со словом
                    ZStack {
                        if flipped {
                            EasyCardBack(width: self.$width, height: self.$heigh)
                        } else {
                            EasyCardFront(width: self.$width, height: self.$heigh)
                        }
                    }
                    .cornerRadius(7.5)
                    .border(Color.black.opacity(0.8), width: 4)
                    .cornerRadius(7.5)
                    .rotation3DEffect(.degrees(degrees), axis: (x: 0, y: 1, z: 0))

                   //Кнопки включение таймера/пауза
            
            VStack {

                HStack(spacing: 20) {
                    
                    //Принять ответ
                    Button(action: {
                        self.flipped = false
                        withAnimation {
                            self.degrees -= 180
                            self.width = 350
                            self.heigh = 250
                        }
                        self.timeManager.pause()
                        self.timeManager.reset()
                    }) {
                        VStack {
                            Image(systemName: "checkmark")
                                .padding()
                                .background(Color.green.opacity(0.9))
                                .clipShape(Circle())
                                .font(.system(size: 25))
                            
                            Text("Правильно!")
                                .font(.custom("coolJazz", size: 20))
                            
                        }.foregroundColor(.black)
                        
                    }
              }
                    .disabled(self.timeManager.timerMode == .running ? false : true)
                
                    //Кнопка включения/остановки таймера
                    Button(action: {
                        if self.timeManager.timerMode == .initial {
                            self.timeManager.setTimerLenght(minutes: self.availableMinutes * 5)
                        }
                        
                        self.timeManager.timerMode == .running ? self.timeManager.pause() : self.timeManager.start()
                        
                        if self.flipped {
                            self.flipped = false
                            withAnimation {
                                self.degrees += 180
                                self.width = 350
                                self.heigh = 230
                            }
                        } else {
                            self.flipped = true
                            withAnimation {
                                self.degrees -= 180
                                self.width = 350
                                self.heigh = 230
                            }
                        }
                    }) {
                        VStack {
                            Image(systemName: timeManager.timerMode == .running ? "pause.circle" : "play.circle")
                                .font(.system(size: 57))
                            
                        Text(self.timeManager.timerMode == . running ? "Пауза" : "Старт")
                                .font(.custom("coolJazz", size: 20))
                        }.foregroundColor(.black)
                    }
                
                    //Неправильный ответ
                    Button(action: {
                        self.flipped = false
                        self.timeManager.pause()
                        self.timeManager.reset()
                        withAnimation {
                            self.degrees -= 180
                            self.width = 350
                            self.heigh = 250
                        }
                    }) {
                        VStack {
                            Image(systemName: "xmark")
                                .padding()
                                .background(Color.red.opacity(0.9))
                                .clipShape(Circle())
                                .font(.system(size: 25))
                            
                            Text("Нарушение!")
                                .font(.custom("coolJazz", size: 20))
                            
                        }.foregroundColor(.black)
                    }.disabled(self.timeManager.timerMode == .running ? false : true)
                }
            }.padding(.vertical)
       }

Пробовал дописать следующий код в action кнопки таймера в игровом view, но не сработало.

if self.timeManager.leftSeconds == 0 {
     self.flipped = false
}

Может кто нибудь подсказать, где здесь ошибка и как поправить, чтобы карточка переворачивалась обратно?


Ответы (0 шт):