2016-01-16 14 views
19

to jest switch, że ja otrzymuję błędy na:Co jest tego przyczyną: Nie można skakać z instrukcji switch do tego przypadku etykiety

 switch (transaction.transactionState) { 

     case SKPaymentTransactionStatePurchasing: 

      // show wait view here 
      statusLabel.text = @"Processing..."; 
      break; 

     case SKPaymentTransactionStatePurchased: 

      [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 

      // remove wait view and unlock iClooud Syncing 
      statusLabel.text = @"Done!"; 

      NSError *error = nil; 
      [SFHFKeychainUtils storeUsername:@"IAPNoob01" andPassword:@"whatever" forServiceName: kStoredData updateExisting:YES error:&error]; 

      // apply purchase action - hide lock overlay and 
      [oStockLock setBackgroundImage:nil forState:UIControlStateNormal]; 

      // do other thing to enable the features 

      break; 

     case SKPaymentTransactionStateRestored: 

      [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 

      // remove wait view here 
      statusLabel.text = @""; 
      break; 

     case SKPaymentTransactionStateFailed: 

      if (transaction.error.code != SKErrorPaymentCancelled) { 
       NSLog(@"Error payment cancelled"); 
      } 
      [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
      // remove wait view here 
      statusLabel.text = @"Purchase Error!"; 
      break; 

     default: 
      break; 
    } 

dwóch ostatnich przypadkach, plus domyślnie dają mi następujące błąd:

Cannot jump from switch statement to this case label

Użyłem instrukcji switcha wiele, wiele razy; po raz pierwszy widziałem to. Kod został skopiowany z samouczka (here), który staram się dostosować do mojej aplikacji. Doceniłbym pomoc w tej sprawie. SD

+1

Czy mógłbyś spróbować wstawić wnętrza wszystkich bloków 'case' w nawiasy klamrowe i zobaczyć, czy to coś zmieni? W ten sposób: http://www.apeth.com/iOSBook/ch01.html#EXswitch – matt

+1

Nie można zadeklarować 'NSError * error = nil;' wewnątrz obudowy bez zamykania go w bloku (nawiasy klamrowe) – Wain

Odpowiedz

55

C nie jest Swift. Będziesz szczęśliwszy, jeśli uporządkować swoje wypowiedzi switch za pomocą nawiasów klamrowych cały przypadków wnętrzach, jak this:

switch (tag) { 
    case 1: { // curly braces 
     // ... 
     break; 
    } 
    case 2: { // curly braces 
     // ... 
     break; 
    } 
    case 3: { // curly braces 
     // ... 
     break; 
    } 
} 

Dodatkowy poziom klamrami pozwala robić rzeczy nie można zrobić inaczej.

+0

Niewiarygodne! Nie mogłem zobaczyć "drzew w lesie". Wiedziałem o tym, nie mogąc o tym myśleć ... dzięki Matt SD – SpokaneDude

+0

Jednym z wielu powodów, dla których nigdy nie używam 'switch' w C ... :) Zbyt wiele pułapek dla mojego gustu. – matt

Powiązane problemy