2015-06-26 3 views
0

У меня есть цикл, как это:IOS петля перерыв с выключателем

label: for(X *y in z) 
    { 
     switch(y.num) 
     { 
      case ShouldDoSomething: 
      [self somethingWithX:y]; 
      break; 
      case ShouldStopNow: 
      y = [self valWhenStopped]; 
      break label; 
     } 
     [val append y]; 
    } 

Конечно, так как Objective-C не поддерживает маркировки петель (по крайней мере, когда я пытаюсь, он бросает ошибку компиляции, говоря Expected ';' after break statement) , это не работает. Есть ли способ, которым я могу разбить цикл, используя случай переключения в Objective-C? Если нет, то в чем лучшая практика с тем же эффектом?

+1

вас может использовать «goto' + label», [но вы действительно хотите сделайте это] (http://stackoverflow.com/questions/1764354/how-can-i-use-goto-in-a-switch-statement-in-objective-c)? –

ответ

4

Решение состоит в том, чтобы поместить все выражение в метод и выйти из оператора switch с возвратом.

- (void)checkSomething:(id)object 
{ 
    for(X *y in object) 
    { 
    switch(y.num) 
    { 
     case ShouldDoSomething: 
     something(); 
     break; 
     case ShouldStopNow: 
     return; 
     break; 
    } 
    somethingElse(); 
    } 
} 

Другим решением является использование булево флаг

for(X *y in Z) 
    { 
    BOOL willExitLoop = false; 
    switch(y.num) 
    { 
     case ShouldDoSomething: 
     something(); 
     break; 
     case ShouldStopNow: 
     willExitLoop = true; 
     break; 
    } 
    if (willExitLoop) break; 
    somethingElse(); 
    } 
+0

Это похоже на два решения в одном ответе. Возможно, разделите их на два ответа? –

+0

Я изменил форматирование ответа, чтобы сделать его более ясным – vadian

+1

Вы по-прежнему центрируете свой ответ, используя метод и возвращаете, но не предоставляете код. И тогда вы несколько пассивно говорите, что есть другое решение, и укажите код для этого. –

1

Вы также можете использовать флаг:

 
for(...) 
{ 
    BOOL stop = NO ; 
    switch(...) 
    { 
     case x: 
      break ; 
     case y: 
      stop = YES ; 
      break ; 
    } 
    if (stop) { break ; } 
    somethingElse(); 
} 
0

Я думаю, что вы ищете continue:

for(X *y in Z) 
{ 
switch(y.num) 
{ 
    case ShouldDoSomething: 
     something(); 
     break; 
    case ShouldStopNow: 
     continue; //-- this will break the switch and reenter the for loop with the next element 
} 
somethingElse(); 
} 
+0

За исключением того, что будет продолжаться цикл, возможно, 1 или более раз. Я хочу полностью прекратить цикл. –

Смежные вопросы