2015-11-05 7 views
17

Si consideri il seguente istruzione switch:Definizione di un blocco in un risultato istruzione switch in un errore di compilazione

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

provoca l'errore del compilatore

Cannot jump from switch statement to this case label

sulla linea case 1:.

Perché sta succedendo e come lo risolvo?

risposta

52

La definizione di blocco crea un nuovo ambito che sembra interferire con la capacità del compilatore di interpretare correttamente l'istruzione switch.

L'aggiunta di delimitatori di ambito per ogni etichetta del caso risolve l'errore. Penso che questo sia dovuto al fatto che l'ambito del blocco è ora senza ambiguità un bambino dell'ambito del caso.

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

C'è un bug open with LLVM per un problema simile.

+4

Strano ... Mi stavo grattando la testa. BTW aggiungendo queste parentesi solo sul caso che precede il caso in cui viene mostrato l'errore risolve anche il problema. – Yawar

+0

Interessante, grazie per il tuo commento. Mi è mancato nei miei test perché ho applicato le parentesi per coerenza – aednichols

Problemi correlati