【问题标题】:compare an array of enums in (Objective) C比较(Objective)C中的枚举数组
【发布时间】:2010-10-02 23:32:07
【问题描述】:

我想测试从一种状态到另一种状态的转换。我在这样的枚举中定义了我的状态:

enum FingerStatus {
FINGERS_UP,
MOVING,
FINGERS_STILL
};

我有一个“currentState”和一个“newState”变量。我知道枚举只是整数,如果它们是 16 位整数(我认为它们是),则可以将两个枚举表示为一个 32 位整数。

我觉得我应该能够做一些类似的事情

switch ({currentStatus, newFingerStatus}) {
    case {FINGERS_STILL, MOVING}:
        NSLog(@"fingers starting to move");
        break;
    case {MOVING, FINGERS_STILL}:
        NSLog(@"fingers stopped moving");
        break;
    default:
        break;
}

我意识到语法完全错误,但我认为基本思想是正确的。有没有另一种好的、干净的方法来做到这一点?

【问题讨论】:

    标签: c arrays state-machine


    【解决方案1】:

    如果你能保证你的枚举小于 16 位,这将起作用:

    switch ((currentStatus<<16) + newFingerStatus) {
        case (FINGERS_STILL<<16) + MOVING:
            NSLog(@"fingers starting to move");
            break;
        case (MOVING<<16) + FINGERS_STILL:
            NSLog(@"fingers stopped moving");
            break;
        default:
            break;
    }
    

    【讨论】:

    • 谢谢!我可以通过为它们分配可以使用 16 位或更少的值来保证它们小于 16 位吗?
    • 是的,如果您为它们分配值,那么它们将具有这些值。 :-)
    • 我应该更准确地说,“如果你的枚举值可以用少于 16 位表示”。
    • 酷。这对我有用。我最终制作了另一个表示转换的枚举,以便我的 switch 语句可以更漂亮。再次感谢您的帮助。
    【解决方案2】:

    由于开关只是编写 goto 的一种奇特方式,因此您不能使用它们来做您想做的事情。改用 ifs:

    if(currentStatus == FINGERS_STILL && newFingerStatus == MOVING)
    {
        NSLog(@"fingers starting to move");
    }
    else if(currentStatus == MOVING && newFingerStatus == FINGERS_STILL)
    {
        NSLog(@"fingers stopped moving");
    }
    

    【讨论】:

      【解决方案3】:

      整数可以超过 16 位,在计算机上通常是 32 位(不确定 iPhone),但您的想法仍然有效。

      您可以使用 (intOne + ( intTwo

      【讨论】:

        【解决方案4】:

        对于一个人来说,给枚举提供不同的唯一值可能是明智的:1,2,4 而不是 0,1,2 然后你可以按位或它们。然后你可以做这样的标签:

        case FINGERS_STILL|MOVING:
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-16
          • 1970-01-01
          • 1970-01-01
          • 2014-03-15
          • 1970-01-01
          相关资源
          最近更新 更多