2012-01-23 5 views
9

Sembra che si stia verificando un problema durante la creazione di nuove variabili locali all'interno di un'istruzione switch. Ho pensato che fosse qualcosa nelle intestazioni di classe, ma ho persino ricevuto degli errori nel tentativo di allocare un nuovo NSObject. Ecco la mia sintassi:Istruzioni switch e allocazione di variabili di istanza in Objective-C

-(NSArray *)charactersFromChapter:(NSInteger)number { 
    NSObject *noError = [[NSObject alloc] init]; 
    //line above does not cause error 
    NSArray *characters; 
    switch (number) { 
     case 1: 
      NSObject *obj = [[NSObject alloc] init]; 
      //error happens in line above (Expected expression) 
      characters = [NSArray arrayWithObject:obj]; 
      break; 
     case 2: 

      break; 
     case 3: 

      break; 
    } 
    return characters; 
} 
+2

Nota, quelli non sono 'ivars. Un ivar è una variabile di istanza, qualcosa che dovresti dichiarare nel file di intestazione. Queste sono semplicemente variabili locali. Sarebbe sicuramente bello se il comitato degli standard C consentisse lo stile che hai tentato. –

+0

grazie per il chiarimento, correggerò la domanda – Justin

+1

@GrahamPerks: Ivars non deve più essere nell'intestazione; possono essere immediatamente dopo la riga '@ implementation'. –

risposta

32

In un'istruzione switch, non è possibile inizializzare le variabili senza prima impostare un ambito, quindi per risolverlo, fare qualcosa del genere:

+0

sì, che lo ha risolto. Grazie per la pronta risposta. accetterà risposta dopo 10 minuti quando è consentito – Justin

+0

Grazie. ha funzionato :) –

5

Devi o dichiarare "obj" al di fuori dell'istruzione switch, o utilizzare le parentesi come segue:

switch (number) { 
    case 1: { 
     NSObject *obj = [[NSObject alloc] init]; 
     //error happens in line above (Expected expression) 
     characters = [NSArray arrayWithObject:obj]; 
     break; 
    } 

Vedi qui per maggiori informazioni: Why can't variables be declared in a switch statement?

+1

grazie per il link, ho qualche studio da fare – Justin

1

In caso di switch è possibile utilizzare solo espressioni.

È possibile risolvere questo problema utilizzando qualcosa di simile:

case 1: 
{ 
     NSObject *obj = [[NSObject alloc] init]; 
     characters = [NSArray arrayWithObject:obj]; 
     break; 
} 
Problemi correlati