作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想将类静态变量作为状态,但 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/
我是一名优秀的程序员,十分优秀!