2014-01-15 2 views
15

Скажут, у меня есть переключатель заявление с пятью случаев, но только два реальные методы никогда не называют, например, так:проваливается в переключателе заявлении для IOS/Objective-C

switch (condition) { 
    case conditionOutcome1: 

     [self firstMethod]; 
     break; 

    case conditionOutcome2: 
     [self secondMethod]; 
     break; 

    case conditionOutcome3: 

     [self firstMethod]; 
     break; 

    case conditionOutcome4: 

     [self firstMethod]; 

     break; 
    case conditionOutcome5: 

     [self secondMethod]; 
     break; 

    default: 
     break; 
} 

Безопасно группу вверх по случаям , вот так?

switch (condition) { 

    case conditionOutcome1: 
    case conditionOutcome3: 
    case conditionOutcome4: 

     [self firstMethod]; 
     break; 

    case conditionOutcome2: 
    case conditionOutcome5: 

     [self secondMethod]; 
     break; 


    default: 
     break; 
} 

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

Спасибо!

+0

Если вы использовали его в C, то почему бы и нет? В объективе-C выбросьте все, начиная с @, и вы получите чистое C. –

+0

Это справедливая точка, спасибо. –

ответ

8

Да, это нормально.

Я использовал его раньше. Он останавливает повторяющийся код.

8

Да 100% безопасно использовать

переключатель (условие) {

case conditionOutcome1: 
case conditionOutcome3: 
case conditionOutcome4: 

    [self firstMethod]; 
    break; 

case conditionOutcome2: 
case conditionOutcome5: 

    [self secondMethod]; 
    break; 


default: 
    break; } 

Это всегда используется для нескольких case S, которые имеют одинаковый набор действий (дублирование кодов) в выполняться.

Как все cases будет выполняться до тех пор, пока не произойдет столкновение break.

+2

Не сжиматься с другим ответом, говоря «да», но просто добавляя примечание. Возможно, вы захотите записать это в своем коде, поставив комментарий между этими случаями. Простая '/ * FALLTHROUGH * /' напомнит вам позже, что вы на самом деле хотели ее написать. Это требует [Руководство по стилю BSD] (http://www.freebsd.org/cgi/man.cgi?query=style&sektion=9). – greg

+0

Хороший совет, спасибо :) –

+0

@greg: Fall through - отличное слово, которое я не помню при написании ответа. Однако я упомянул «все случаи будут выполнены до тех пор, пока не будет найден разрыв». –

11

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

+0

Отлично, большое спасибо за ссылку! –

+1

У вас также есть '[[clang :: fallthrough]]', чтобы указать на явное намерение, когда вы устанавливаете свои предупреждения в * paranoid * :) ... видели его в блоге [llvm] (http://blog.llvm.org/ 2013/09/clang-warnings.html) и технические подробности в [clang documentation] (http://clang.llvm.org/docs/LanguageExtensions.html#non-standard-c-11-attributes) –

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