Posso declarar variables ​​dentro de uma instrução switch do Objective-C?

Acho que estou ficando cego, porque não consigo descobrir onde está o erro de syntax neste código:

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

Quando tento compilá-lo, estou recebendo um erro de syntax Error: before antes do token ‘*’ na última linha.

Desculpe por uma questão tão básica, mas o que estou perdendo?

Eu não tenho um compilador Objective-C adequado disponível, mas contanto que as construções C sejam idênticas:

switch { … } fornece um escopo no nível do bloco, não um para cada case . Declarar uma variável em qualquer lugar diferente do início do escopo é ilegal, e dentro de um switch é especialmente perigoso porque sua boot pode ser saltada.

Algum dos seguintes itens resolve o problema?

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

Você não pode declarar uma variável no início de uma declaração de caso. Faça um caso de teste que consiste apenas nisso e você obterá o mesmo erro.

Não tem a ver com variables ​​sendo declaradas no meio de um bloco – mesmo adotando um padrão que permita que o GCC não aceite uma declaração no início de uma declaração de caso. Parece que o GCC vê o label do caso como parte da linha e, portanto, não permite uma declaração nesse local.

Uma solução simples é apenas colocar um ponto e vírgula no início do caso para que a declaração não seja no início.

Em C, você só pode declarar variables ​​no início de um bloco antes de quaisquer declarações que não sejam declaradas.

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

Em C ++, você pode declarar variables ​​onde você precisar.

Pode não ser válido declarar uma variável dentro de um bloco de comutação?

Você pode criar uma variável dentro de uma instrução switch, mas terá que criá-la dentro de um bloco para que o escopo dessa variável seja definido.

Exemplo:

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

Como resolver o aviso:

1.Insira um ; na primeira linha do seu bloco de casos

Códigos 2.Put dentro de chaves