¿Puedo declarar variables dentro de una statement de cambio de Objective-C?

Creo que me estoy quedando ciego, porque no puedo entender dónde está el error de syntax en este código:

if( cell == nil ) { titledCell = [ [ [ TitledCell alloc ] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier ] autorelease ]; switch( cellNumber ) { case 1: NSString *viewDataKey = @"Name"; etc... 

Cuando bash comstackrlo, obtengo un error: error de syntax antes del token ‘*’ en la última línea.

Perdón por una pregunta tan básica, pero ¿qué me estoy perdiendo?

No tengo disponible un comstackdor Objective-C adecuado, pero siempre que las construcciones C sean idénticas:

switch { … } le da un scope de nivel de bloque, no uno para cada case . Declarar una variable en cualquier lugar que no sea el comienzo del scope es ilegal, y dentro de un switch es especialmente peligroso porque su inicialización puede saltarse.

¿Alguno de los siguientes resuelve el problema?

 NSString *viewDataKey; switch (cellNumber) { case 1: viewDataKey = @"Name"; … } switch (cellNumber) { case 1: { NSString *viewDataKey = @"Name"; … } … } 

No puede declarar una variable al comienzo de una statement de caso. Haga un caso de prueba que solo consista en eso y obtendrá el mismo error.

No tiene que ver con que las variables se declaren en el medio de un bloque, incluso la adopción de un estándar que permita eso no hará que GCC acepte una statement al comienzo de una statement de caso. Parece que GCC ve la etiqueta del caso como parte de la línea y, por lo tanto, no permitirá una statement allí.

Una solución simple es simplemente poner un punto y coma al comienzo del caso para que la statement no esté al inicio.

En C, solo puede declarar variables al comienzo de un bloque antes que cualquier statement que no sea de statement.

 { /* you can declare variables here */ /* block statements */ /* You can't declare variables here */ } 

En C ++ puede declarar variables donde las necesite.

¿No sería válido declarar una variable dentro de un bloque de interruptores?

Puede crear una variable dentro de una instrucción switch pero deberá crearla dentro de un bloque para que se defina el scope de esa variable.

Ejemplo:

 switch(number){ case 1: { // Create object here // object is defined only for the scope of this block } break; case 2: { // etc. } break; default: break; } 

Cómo resolver la advertencia:

1.Inserte uno ; en la primera línea de tu caja

2. Ponga códigos dentro de llaves