【问题标题】:iOS - Cannot jump from switch statement to this case label?iOS - 不能从 switch 语句跳转到这个案例标签?
【发布时间】:2017-03-12 16:37:57
【问题描述】:

我正在尝试在应用购买交易成功后将数据发布到我的数据库。也就是说,当我使用下面的代码时,XCode 会抛出错误:

“不能从switch语句跳转到这个case标签”

我该如何解决这个问题?请参阅下面的代码。

.m

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions{
    for(SKPaymentTransaction *transaction in transactions){
        switch(transaction.transactionState){
            case SKPaymentTransactionStatePurchasing: NSLog(@"Transaction state -> Purchasing");

                break;
            case SKPaymentTransactionStatePurchased:


                self.indicatorThree.hidden = YES;
                [self.indicatorThree stopAnimating];

                self.indicatorTwo.hidden = YES;
                [self.indicatorTwo stopAnimating];

                self.indicatorThree.hidden = YES;
                [self.indicatorThree stopAnimating];


                NSMutableDictionary *viewParams3 = [NSMutableDictionary new];
                [viewParams3 setValue:@"current_user" forKey:@"view_name"];
                [DIOSView viewGet:viewParams3 success:^(AFHTTPRequestOperation *operation, id responseObject) {

                    self.currentUser = [responseObject mutableCopy];

                    NSString *pointBalance = self.currentUser[0][@"points balance"];



                    NSMutableDictionary *userData = [NSMutableDictionary new];


                    int result = [pointBalance intValue] + [self.pointsPurchase intValue];
                    NSLog(@"THIS IS THE RESULT POINTS NUMBER %d", result);

                    NSString *resultPoints = [NSString stringWithFormat:@"%d", result];


                    NSDictionary *targetPoints = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects: resultPoints, nil] forKeys:[NSArray arrayWithObjects:@"value", nil]];
                    NSDictionary *finalPoints = [NSDictionary dictionaryWithObject:[NSArray arrayWithObject:targetPoints] forKey:@"und"];

                    [userData setObject:finalPoints forKey:@"field_points_balance"];

                    NSLog(@"FINAL POINTS TO POST %@", finalPoints);

                    NSDictionary *user = [[DIOSSession sharedSession] user];
                    NSString *uid = user[@"uid"];


                    [userData setObject:uid forKey:@"uid"];

                    [DIOSUser
                     userUpdate:userData
                     success:^(AFHTTPRequestOperation *op, id response) { /* Handle successful operation here */

                         NSString *userPoints = user[@"field_points_balance"][@"und"][0][@"value"];
                         NSLog(@"AFTER SAVE USER POINTS %@", userPoints);



                         [[NSNotificationCenter defaultCenter] postNotificationName:@"loginComplete" object:nil];


                     }
                     failure:^(AFHTTPRequestOperation *op, NSError *err) { /* Handle operation failire here */

                         NSLog(@"User data failed to update!");
                     }
                     ];



                } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                    NSLog(@"Failure: %@", [error localizedDescription]);
                }];


                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                NSLog(@"Transaction state -> Purchased");
                break;
            case SKPaymentTransactionStateRestored:
                NSLog(@"Transaction state -> Restored");

                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                break;
            case SKPaymentTransactionStateFailed:

                if(transaction.error.code == SKErrorPaymentCancelled){
                    NSLog(@"Transaction state -> Cancelled");
                    //the user cancelled the payment ;(
                }
                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                break;
        }
    }
}

【问题讨论】:

  • 它指向哪个案例标签?
  • 一个建议。您发布的代码可能很难阅读。当case 语句的代码不止几行时,我会为该代码创建一个方法,然后简单地调用该方法,然后调用break。我建议将 SKPaymentTransactionStatePurchased 案例的所有代码放在它自己的方法中。
  • @Saranjith SKPaymentStateTransactionRestored 和 SKPaymentStateTransactionFailed
  • @rmaddy 太好了。主意!谢谢你:)
  • 这可能是您使用牙套的问题。开关循环正在关闭,因此可能有两种情况。请检查一下

标签: ios objective-c


【解决方案1】:

我之前也遇到过同样的问题,只需在您的情况下添加一个 {},您的所有问题都会得到解决。

块定义创建了一个新作用域,这似乎干扰了编译器正确解释 switch 语句的能力。

为每个案例标签添加范围分隔符可解决该错误。我认为这是因为块的范围现在明确地是 case 范围的子级。

switch (transaction.transactionState) {
    case 0:
    {
        // ...
        break;
    }
    case 1:
    {
        // ...
        break;
    }
    default:
        break;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-22
    • 2021-11-13
    • 1970-01-01
    • 2015-06-21
    • 2014-08-30
    • 2010-10-23
    • 1970-01-01
    • 2014-01-03
    相关资源
    最近更新 更多