2011-12-13 17 views
84

salía esta Xcode: Pero cuando intento poner algo en el caso 1 (o vacío) me está dando un error?Caso en el interruptor protegido

Problema extraño porque no sé qué es un interruptor protegido y cómo debería solucionarlo. ¿Alguien tiene una solución o pista para arreglar esto? Raro ..

- (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 

Pero un error:

Error

Respuesta

201

Usted debe envolver cada sentencia switch con {} tirantes. Por ejemplo:

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

Esto ya ha sido respondida aquí, por cierto - When converting a project to use ARC what does "switch case is in protected scope" mean?

+2

No es necesario ajustar CADA interruptor en '{}', solo aquellos que declaran variables (explícitamente o mediante un swizzle de macro o compilador). ARC tiene relativamente poco que ver con eso. –

34

En general, nunca se debe declarar variables dentro de un cuerpo case, a menos que se envuelve el cuerpo de caja en {}. La mayoría de los compiladores de C marcarán eso como un error bajo varias circunstancias (aunque a menudo un error que suena muy oscuro).

La razón de esto es que el compilador no puede decir dónde termina el alcance de la variable, y si tiene una declaración en el primer cuerpo case, entonces parece que el segundo case es una rama en el medio del el alcance de la variable, haciendo que el compilador se pregunte cómo/si debería inicializarse.

Cuestiones relacionadas