Стиль форматирования Objective-c вызывает ошибку в switch-case - PullRequest
5 голосов
/ 09 июля 2010

Я получаю ошибку в своем операторе switch с некоторым многострочным кодом Objective-c:

- (void)mailComposeController:(MFMailComposeViewController*)controller
          didFinishWithResult:(MFMailComposeResult)result
                        error:(NSError*)error 
{   
    // Notifies users about errors associated with the interface
    switch (result)
    {
        case MFMailComposeResultCancelled:
            break;
        case MFMailComposeResultFailed:
//              NSLog(@"Mail Failed");
            UIAlertView *alert = [[UIAlertView alloc] 
                                initWithTitle:NSLocalizedString(@"Error", @"Error")
                                message:[error localizedDescription]
                                delegate:nil
                                cancelButtonTitle:NSLocalizedString(@"OK", @"OK")
                                otherButtonTitles:nil];
            [alert show];
            [alert release];
            break;
        default:
            break;
    }
}

Если я раскомментирую строку с NSLog, она будет работать нормально.Что вызывает эту ошибку?Есть ли способ использовать этот вид форматирования?

Ответы [ 2 ]

20 голосов
/ 09 июля 2010

Вы не должны объявлять переменную в switch case, если не введете область действия.

    case MFMailComposeResultFailed: {  // <--
        UIAlertView *alert = [[UIAlertView alloc] 
                            initWithTitle:NSLocalizedString(@"Error", @"Error")
                            message:[error localizedDescription]
                            delegate:nil
                            cancelButtonTitle:NSLocalizedString(@"OK", @"OK")
                            otherButtonTitles:nil];
        [alert show];
        [alert release];
        break;
    } // <--

Фактическая ошибка заключается в том, что в стандарте C (& sect; 6.8.1) после метки может следовать только оператор (NSLog(@"Mail Failed")), но не декларация (UIAlertView* alert = ...).

9 голосов
/ 09 июля 2010

Проблема в том, как определяется переключатель. Вы не можете иметь объявление переменной в строке, следующей за регистром. Вы можете исправить это, обернув весь корпус в новую область действия

    case MFMailComposeResultFailed:
    {
//              NSLog(@"Mail Failed");
        UIAlertView *alert = [[UIAlertView alloc] 
                            initWithTitle:NSLocalizedString(@"Error", @"Error")
                            message:[error localizedDescription]
                            delegate:nil
                            cancelButtonTitle:NSLocalizedString(@"OK", @"OK")
                            otherButtonTitles:nil];
        [alert show];
        [alert release];
        break;
    }
...