Я только что обновил один из своих проектов до Swift 5, и у меня возникло довольно странное явление.
Я использую GKStateMachine
для обработки состояний в игре. При входе в состояние я также устанавливаю значение enum для соответствующего случая для более чистого общения с внешним миром.
Теперь после обновления до Swift 5 это больше не работает должным образом.
Пример
Это перечисление:
public enum GameState: Equatable {
case setup
case preparing
case calibrating(calibrationState: GameCalibrationState)
case lostTrack
case readyToPlay
case running(canSkipItems: Bool)
case handlingTask
case paused
case gameOver
}
Теперь в состоянии GameOver конечного автомата я делаю следующее:
class GameOverState: GKState {
weak var gameManager: GameManagable?
init(gameManager: GameManagable) {
self.gameManager = gameManager
}
override func didEnter(from previousState: GKState?) {
// Entered game over state and now trying to set game manager state to .gameOver:
gameManager?.currentState = .gameOver
// The currentState property state should now be set to .gameOver but is .lostTrack instead
}
override func isValidNextState(_ stateClass: AnyClass) -> Bool {
switch stateClass {
case is GameSetupState.Type:
return true
default:
return false
}
}
}
Он входит в состояние и в методе »didEnter (from previousState: GKState?)« Я устанавливаю currentState моего объекта GameManager в .gameOver - пока все хорошо. Но почему-то это не работает, так как вместо него установлено значение .lostTrack. То же самое происходит с приостановленным состоянием с прерванным случаем.
И вывод консоли во время работы:
Интересно, что когда я изменяю порядок дел в перечислении, он также устанавливает другой случай. Кроме .paused и .gameOver все остальные, кажется, работают и настроены правильно.
Это определенно работало раньше, и я понятия не имею, что может происходить. На данный момент мне кажется, что это системная ошибка
Скриншот соответствующих определений в GameManager:
Побочный эффект: он также работает, когда я избавляюсь от связанных значений перечислений.
Один и тот же результат в Xcode 10.2 и Xcode 10.2.1
Пример игровой площадки, которая воспроизводит проблему:
https://www.sendspace.com/file/qudvzt