2016-01-16 2 views
19

Dieser eine switch-Anweisung ist, dass ich Fehler immer bin auf:Was verursacht diese: Kann nicht auf diesen Fall Label aus switch-Anweisung springen

 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; 
    } 

den letzten beiden Fällen, plus der Standard, geben Sie mir folgende Fehler:

Cannot jump from switch statement to this case label

Ich habe die switch-Anweisung viele, viele Male verwendet; Das ist das erste Mal, dass ich das gesehen habe. Der Code wurde aus einem Tutorial (here) kopiert, das ich für meine App anpassen möchte. Würde die Hilfe bei diesem einen schätzen. SD

+1

Könnten Sie bitte versuchen, das Innere aller 'case' Blöcke in geschweifte Klammern zu setzen und zu sehen, ob sich das ändert? Wie folgt: http://www.apeth.com/iOSBook/ch01.html#EXswitch – matt

+1

Sie können 'NSError * error = nil;' im Gehäuse nicht deklarieren, ohne es in einen Block (geschweifte Klammern) einzuschließen. – Wain

Antwort

55

C ist nicht Swift. Sie werden glücklicher sein, wenn Sie Ihre switch Anweisungen mit geschweiften Klammern Runde alle Fälle Innenräume strukturieren, wie this:

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

Die zusätzliche Ebene der geschweiften Klammern können Sie Dinge tun, die Sie sonst nicht tun können.

+0

Unglaublich! Ich konnte die "Bäume im Wald" nicht sehen. Ich wusste das, nur unfähig, daran zu denken ... Danke Matt SD – SpokaneDude

+0

Einer von vielen Gründen, warum ich 'switch' in C nie benutze ... :) Zu viele Fallen für meinen Geschmack. – matt