Xcode 10.2 - Swift 5带关联值的Enum设置错误状态问题
关于Swift 5升级后GKStateMachine状态枚举错乱的问题解答
看起来你遇到的这个问题是Swift 5与GKStateMachine在Xcode 10.2/10.2.1版本中的已知兼容性Bug,我之前在项目里碰到过几乎一模一样的情况,当时折腾了好一阵才定位到根源。
问题本质
当你的游戏状态枚举带有关联值时,Swift 5的枚举底层存储逻辑和GKStateMachine的状态映射机制出现了冲突,导致设置状态时出现错误的case映射——调整枚举case顺序会改变错误指向的状态,就是这个冲突的典型表现;而移除关联值后枚举的底层存储结构变化,刚好避开了这个Bug触发的条件。
可行的解决方案
- 临时规避(不升级Xcode的情况下):
- 去掉状态枚举的关联值,把需要关联的数据转移到对应的
GKState子类中存储(比如在GameOverState里添加属性来保存原本要关联的信息) - 别尝试通过调整枚举case顺序来“凑对”,这只是临时改变了错误的映射目标,无法从根本解决问题,后续维护很容易出乱子
- 去掉状态枚举的关联值,把需要关联的数据转移到对应的
- 彻底解决(推荐):
- 升级你的Xcode到10.3及以上版本,苹果在这个版本里修复了Swift 5与GameKit状态机的适配问题,升级后带关联值的状态枚举就能正常和GKStateMachine配合工作了
- 如果暂时无法升级Xcode,也可以考虑用结构体/类替代带关联值的枚举来定义状态,再配合GKStateMachine使用,同样能避开这个Bug
补充说明
这个问题在Apple开发者论坛和Stack Overflow社区都有不少开发者反馈过,确认是特定Xcode版本的系统级Bug,完全不是你的代码逻辑问题,不用怀疑自己的实现~
内容的提问来源于stack exchange,提问作者arthurschiller
相关产品推荐
相关产品推荐

