сравнить массив перечислений в (Objective) C - PullRequest
0 голосов
/ 03 октября 2010

Я хочу проверить переход из одного состояния в другое.Я определил мои состояния в перечислении следующим образом:

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;
}

Я понимаю, что весь синтаксис неправильный, но я думаю, что основная идея - это звук.Есть еще один хороший, чистый способ сделать это?

Ответы [ 4 ]

1 голос
/ 03 октября 2010

Если вы можете гарантировать, что ваши перечисления меньше 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;
}
0 голосов
/ 03 октября 2010

хорошо для одного, вероятно, было бы целесообразно дать перечисления различные уникальные значения: 1,2,4, а не 0,1,2, то вы можете поразрядно или их.Тогда вы можете сделать ярлыки, такие как:

case FINGERS_STILL|MOVING:
0 голосов
/ 03 октября 2010

Ints может быть больше 16 бит, и обычно 32 бита на компьютерах (не уверен насчет iPhone), но ваша идея все равно будет работать.

Вы можете использовать (intOne + (intTwo << 4)) для установкидве целые вместе, для сравнения и оценки. </p>

0 голосов
/ 03 октября 2010

Поскольку переключатели - это просто модный способ написания gotos, вы не можете использовать их, чтобы делать то, что вы хотите.Вместо этого используйте ifs:

if(currentStatus == FINGERS_STILL && newFingerStatus == MOVING)
{
    NSLog(@"fingers starting to move");
}
else if(currentStatus == MOVING && newFingerStatus == FINGERS_STILL)
{
    NSLog(@"fingers stopped moving");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...