Как я могу использовать 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, потому что это на самом деле не отвечает на вопрос как таковой]
как говорили другие, это очень плохой стиль и делает нечитаемый код...
варианты:
- разложите общий код на отдельную функцию и вызовите ее в 2 местах.
- используйте fallthroughs, оставьте перерыв на случай, и он попадает в следующий (помните, случаи не должны быть численными порядок!)
- если вы только хотите, чтобы часть дела была сделана в другом случае, защитите его с помощью if:
а в
case 500:
.
.
.
case 501:
if(viewNumber == 501) {
.
.
.
}
.
.
.
break;