2011-12-13 3 views
84

uzyskałem następujący Xcode: Ale gdy próbuję umieścić coś w przypadku 1 (lub pusty) to daje mi błąd?Sprawa w chronionym wyłącznikiem

Dziwny problem, ponieważ nie wiem, co to jest chroniony przełącznik i jak powinienem go naprawić. Czy ktoś ma rozwiązanie lub wskazówkę, aby to naprawić? Dziwne ..

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UIViewController *controller; 

    switch(indexPath.row) { 
     case 0: 
      NSLog(@"0"); 

      //create instance of EKEventStore 
      EKEventStore *eventStore = [[EKEventStore alloc] init]; 

      //creating instance of EKEvent 
      EKEvent *event = [EKEvent eventWithEventStore:eventStore]; 

      //setting the appropriate properties of the new event 
      event.title  = @"Woow"; 

      //event.startDate = [[NSDate alloc] init]; 



      NSDateComponents *myDate2 = [[NSDateComponents alloc] init]; 
      [myDate2 setDay:13]; 
      [myDate2 setMonth:12]; 
      [myDate2 setYear:2011]; 
      [myDate2 setHour:00]; 
      [myDate2 setMinute:34]; 

      event.startDate = [[NSCalendar currentCalendar] dateFromComponents:myDate2]; 

      event.endDate = [[NSDate alloc] initWithTimeInterval:3600 sinceDate:event.startDate]; 
      event.location = @"game2"; 
      event.notes = @" game"; 

      event.alarms = [NSArray arrayWithObject:[EKAlarm alarmWithAbsoluteDate:event.startDate]]; 

      [event setCalendar:[eventStore defaultCalendarForNewEvents]]; 
      NSError *error; 
      [eventStore saveEvent:event span:EKSpanThisEvent error:&error]; 

      break; 

     case 1: 
      NSLog(@"1");  






      break; 






    } 

    { 



     self.EKController.title = [self.EKList objectAtIndex:[indexPath row]]; 






    } 

} 


@end 

Ale błąd:

Error

Odpowiedz

201

należy owinąć każdą instrukcję switch z {} szelkami. Na przykład:

switch (someInt) { 
    case 0: 
    { 
     NSLog(@"Case 0"); 
    } 
    break; 
    case 1: 
    { 
     NSLog(@"Case 1"); 
    } 
    break; 
} 

Zostało odpowiedział już tutaj przy okazji - When converting a project to use ARC what does "switch case is in protected scope" mean?

+2

Nie jest konieczne zawijanie KAŻDEGO przełącznika w '{}', tylko te, które deklarują zmienne (jawnie lub poprzez makro lub kompilator swizzle). ARC ma z tym niewiele wspólnego. –

34

Ogólnie rzecz biorąc, nigdy nie powinno się deklarować zmienne wewnątrz case ciała, chyba że owinąć ciało przypadek w {}. Większość kompilatorów C zaznacza to jako błąd w kilku okolicznościach (choć często jest to bardzo niejasny błąd).

Powodem tego jest to, że kompilator nie może stwierdzić, gdzie kończy się zmienna, a jeśli masz deklarację w pierwszym ciele case, to wygląda na to, że drugi case jest odgałęzieniem w środku zakres zmiennej, powodując, że kompilator zastanawia się, jak/jeśli powinien być zainicjalizowany.