2015-11-05 11 views
17

Rozważmy następujący switch:Definiowanie bloku w wynikach instrukcji switch w błąd kompilatora

switch (buttonIndex) { 
    case 0: 
     [self fooWithCompletion:^{ 
      [weakSelf finishEditing]; 
     }]; 
     break; 
    case 1: // Error here 
     [self barWithCompletion:^{ 
      [weakSelf finishEditing]; 
     }]; 
     break;  
    default: 
     break; 
} 

To powoduje błąd kompilatora

Cannot jump from switch statement to this case label

na linii case 1:.

Dlaczego tak się dzieje i jak mogę to naprawić?

Odpowiedz

52

Definicja bloku tworzy nowy zakres, który wydaje się kolidować ze zdolnością kompilatora do prawidłowej interpretacji instrukcji switch.

Dodanie ograniczników zakresu dla każdej etykiety przypadku rozwiązuje problem. Myślę, że dzieje się tak dlatego, że zakres bloku jest teraz jednoznacznie dzieckiem zakresu sprawy.

switch (buttonIndex) { 
    case 0: 
    { 
     [self updateUserDataWithCompletion:^{ 
      [weakSelf finishEditing]; 
     }]; 
     break; 
    } 
    case 1: 
    { 
     [self updateOtherDataWithCompletion:^{ 
      [weakSelf finishEditing]; 
     }]; 
     break; 
    } 
    default: 
     break; 
} 

Dla podobnego problemu jest bug open with LLVM.

+4

Dziwne ... drapałem się po głowie. BTW dodawanie tych nawiasów tylko w przypadku, który jest przed przypadkiem, w którym pojawia się błąd, również rozwiązuje problem. – Yawar

+0

Interesujące, dziękuję za komentarz. Pominięto to w moich testach, ponieważ stosowałem aparaty ortodontyczne w celu zachowania spójności – aednichols

Powiązane problemy