我刚刚将我的一个项目更新为Swift 5,并且发生了一件很奇怪的事情。
我正在使用GKStateMachine
处理游戏的状态。进入状态时,我还将枚举的值设置为相关的大小写,以便与外界进行更清晰的通信。
现在,在更新到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?)«方法中,将GameManager对象的currentState设置为.gameOver,到目前为止,效果很好。但是以某种方式,这是行不通的,因为它改为设置为.lostTrack。对于处于.paused情况的暂停状态,情况也是如此。
有趣的是,当我更改枚举中的案例顺序时,它也将其设置为其他案例。除了.paused和.gameOver以外,其他所有似乎都可以正常工作并正确设置。 以前肯定是可行的,我不知道会发生什么。在我看来,这似乎是一个系统错误
Sidefact:当我摆脱枚举案例的关联值时,它也起作用。
Xcode 10.2和Xcode 10.2.1的结果相同
再现问题的示例游乐场: https://www.sendspace.com/file/qudvzt