Как я могу использовать goto в операторе switch в Objective-C?

в моем коде мне нужно иметь возможность прыгать (goto) другой случай в том же операторе switch. Есть ли способ сделать это?

мой код примерно такой: (есть много кода, который я просто оставил все это)

switch (viewNumber) {
case 500:
        // [...]
break;

case 501:
        // [...]
break;
.
.
.
.
.

case 510:
        // [...]
break;

default:
break;

}

Спасибо за ваше время! - Джефф!--2-->

4 ответов


обычно очень плохая практика безусловно прыгать, как вы просите.

Я думаю, что более читаемым / поддерживаемым решением было бы разместить общий код в методе и иметь несколько случаев вызова метода.

Если вы действительно хотите, вы можете использовать goto сделать что-то вроде:

switch(viewNumber) {
    case 500:
        // [...]
        goto jumpLabel;
    case 501:
        // [...]
        break;
    case 502:
        // [...]
        jumpLabel:
        // Code that 500 also will execute
        break;
    default:break;
}

примечание: Я только привел пример кода выше, чтобы ответить на ваш вопрос. Теперь я чувствую себя таким грязным, что, возможно, придется купить. некоторые Плохой Код Смещения.


вместо goto, рефакторинг кода, чтобы два (или более) случая, которые используют общий код, вызывали его в общем методе.

что-то типа:

switch (value) {
   case (firstValue):
       // ...
       break;
   case (secondValue):
       [self doSharedCodeForSecondAndThirdValues];
       break;
   case (thirdValue):
       [self doSharedCodeForSecondAndThirdValues];
       break;
   default:
       break;
}

// ...

- (void) doSharedCodeForSecondAndThirdValues {
   // do stuff here that is common to second and third value cases
}

это не было бы концом света, чтобы использовать goto, хотя это плохая практика.

практическая причина для избежания использования goto это то, что вы должны искать через ваш swtich-case дерево, чтобы найти что goto метки.

если ваша логика переключателя изменяет, то вы будете иметь неприятная ситуация на ваших руках.

если вы вытащите общий код в свой собственный метод, код легче читать, отлаживать и расширять.


вы, вероятно, должны попробовать переписать свой код, как рекурсивный вызов или просто разложить общие вещи и вызвать отдельную функцию. Но в качестве исправления и быстрого ответа на ваш вопрос вы можете поставить ярлык перед своим коммутатором и перейти к нему, например

switchLabel:
switch(viewNumber) {
  case 500: {
    viewNumber = 501;
    goto switchLabel;
  }
}

не уверен в синтаксисе Objective-C здесь, но вы также можете попробовать его вариант

int lastView = 0;

while (lastView != viewNumber)
  switch(lastView = viewNumber) {
    case 500: {
      viewNumber = 501;
      break;
    }
  }

который будет продолжать цикл, пока viewNumber больше не изменится. Это все довольно просто но симпатичный Гото.

и так как мы делаем gotos, вы можете просто перейти к другому делу, как уже отмечалось. Вы также можете делать причудливые вещи, подобные устройству Даффа, помещая случаи внутри других блоков. Но это просто безумие.. :)


[Я делаю этот ответ сообщества wiki, потому что это на самом деле не отвечает на вопрос как таковой]

как говорили другие, это очень плохой стиль и делает нечитаемый код...

варианты:

  1. разложите общий код на отдельную функцию и вызовите ее в 2 местах.
  2. используйте fallthroughs, оставьте перерыв на случай, и он попадает в следующий (помните, случаи не должны быть численными порядок!)
  3. если вы только хотите, чтобы часть дела была сделана в другом случае, защитите его с помощью if:

а в

case 500:
 .
 .
 .
case 501:
    if(viewNumber == 501)    {
     .
     .
     .
    }
     .
     .
     .
    break;