gpt4 book ai didi

objective-c - 状态机 - 枚举是状态的选择吗?

转载 作者:行者123 更新时间:2023-12-04 02:34:27 27 4
gpt4 key购买 nike

我想将类静态变量作为状态,但 Objective C 不允许

我为状态类尝试了 +(int)LOOPING_STATE,但它会失败

switch (myCurrentState) {
case [STATE_CLASS LOOPING_STATE]: <== received an error of "expression can't be put here"
return;
}

enum 通常是编写状态代码的选择吗?

是否还有其他选项,在什么情况下应该使用这些选项?

提前致谢。

最佳答案

这与 Objective-C 关系不大,但与 Objective-C 中的 C 关系更大。一般来说,使用枚举来表示状态机的状态应该优于普通整数。

不能在 switch 中使用类的原因是 switch 语句的 case 标签中使用的表达式的值需要在编译时知道。假设 [STATE_CLASS LOOPING_STATE] 是类方法的调用,编译器无法在编译时安全地知道该表达式的结果,因此将拒绝生成 switch 语句。

为什么编译器需要在编译时知道用于 case 标签的表达式的结果? switch 语句背后的想法是比一系列语义等价的 if/else if block 更有效。这是通过将 switch 语句转换为具有无条件跳转的调度表来实现的,而 if/else if 解决方案需要大量的条件跳转。很容易猜到,条件跳转从根本上与现代流水线 CPU 设计不一致,因为它们可能导致整个流水线被刷新。 (现代 CPU 试图通过复杂的分支预测进行补偿,但如果我们能够完全避免这个问题会更好,对吧?)

但是,首先要做到正确,其次才是快速。

关于objective-c - 状态机 - 枚举是状态的选择吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7927844/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com