Сравнение нескольких значений одновременно с помощью && - PullRequest
0 голосов
/ 15 февраля 2012

У меня есть этот код:

if ((total == (total1 && total2 && total3)))
     {
        [scrollview.contentOffset = CGPointMake (0,0)];
     }

вот как это выглядит при нажатии кнопки:

if (sender.tag == 1)
    {
        total1 = 10;
    }

if (sender.tag == 2)
    {
        total2 = 20;
    }

if (sender.tag == 3)
    {
        total3 = 30;
    }

Я пытаюсь вернуться на начальную страницу вида прокруткиесли пользователь нажал три правильные кнопки (аналогично ключу пароля).

Хорошо ли работает логический оператор && в Objective-C, и правильно ли я его использовал?

Ответы [ 4 ]

3 голосов
/ 15 февраля 2012
if ((total == (total1 && total2 && total3)))

Вы не можете этого сделать. Вы должны явно сравнить каждый в отдельности.

if ((total == total1) && (total == total2) && (total == total3)))

Но это оставляет вопрос о том, как total может быть равен всем трем одновременно.

1 голос
/ 15 февраля 2012

В вашем коде:

if ((total == (total1 && total2 && total3)))
{
   [scrollview.contentOffset = CGPointMake (0,0)];
}

Когда вычисляется выражение if, (total1 && total2 && total3) вычисляется первым.И это может быть либо YES или NO (true или false, если вы предпочитаете), либо (0 или 1).

Так что ваш код эквивалентен следующему:

BOOL allVariablesAreNotZero = total1 && total2 && total3;
if (total == allVariablesAreNotZero)
{
   [scrollview.contentOffset = CGPointMake (0,0)];
}

Редактировать после того, как вопрос был лучше объяснен

При нажатии кнопок заставить выполнять следующие действия:

- (void)buttonClicked:(id)sender
{
    UIButton *button = (UIButton *)sender;
    buttonsCombination = buttonsCombination | (1 << button.tag);
}

Где buttonsCombination - NSUInteger.Затем используйте следующий тест, чтобы увидеть, являются ли нажатые кнопки правильными (я делаю это с тремя кнопками, но вы догадываетесь об идее)

NSUInteger correctCombination = (1 << button1) | (1 << button2) | (1 << button3)
if (buttonsCombination == correctCombination) {
// The combination is correct
} else {
    // The combination is incorrect
}
buttonsCombination = 0;

Наконец, обратите внимание, что это работает, потому что естьдостаточно битов в NSUInteger для 30 кнопок.Здесь я использовал побитовые операторы | и <<.

0 голосов
/ 15 февраля 2012

Попытка определить, что вы подразумеваете под своим комментарием к двум другим ответам: «Я пробовал это, но он запускает коды, когда я начал запускать приложение», возможно, это то, чего вы пытаетесь достичь:

/* all in your button handler */
switch(sender.tag)
{
   case 1:
      total1 = 10;
      break;
   case 2:
      total2 = 20;
      break;
   case 3:
      total3 = 30;
      break;
   default:
      break; // other buttons are ignored
}
// check it latest click means the total is now correct
if((total1 + total2 + total3) == total)
{
   [scrollview.contentOffset = CGPointMake (0,0)];
}

Таким образом, вы обновляете все totalX, произведенные нажатием кнопки, а затем проверяете условие для сброса прокрутки.

0 голосов
/ 15 февраля 2012

То, что по сути говорит ваш текущий код, это "если total равно" true "и total1, total2 и total3 также все ненулевые или если total равно нулю и total1, total2 и total3 тоже все равны нулю, тогда сделайте что-нибудь ".

&&, который у вас есть, выполняет логическое / логическое сравнение. Он обрабатывает свои аргументы как true или false и возвращает true, если оба аргумента оцениваются как true и false в любом другом случае. == сравнивает значение total со значением true или false, полученным из ваших выражений &&. Это, вероятно, не то, что вы хотите здесь.

Вероятно, вы хотите сказать, что "если total равно сумме total1, total2 и total3, то сделайте что-нибудь". Предполагая, что это так, вы бы сделали:

if (total == (total1 + total2 + total3)) {
    [scrollview.contentOffset = CGPointMake (0,0)];
}
...