2014-04-23 7 views
9

Ho un caso come questo interruttore:iOS non può alloc nuovo oggetto nel caso in cui l'interruttore

switch ([weatherCode intValue]) { 
     case 1: 
      ... 
      break; 
     case 2: 
      .... 
      break; 
    } 

ma voglio alloc un oggetto in questo caso, come NSString *string = @"hello";

ma tenermi dà un errore expect expression che non capisco cosa sta succedendo affatto. Per favore aiuto.

Grazie.

+0

Tutte le dichiarazioni di tutti i casi di un'istruzione switch sono nello stesso campo di applicazione, in modo che quando si dichiara una variabile con un nome in un caso, e poi si dichiara una variabile con lo stesso nome in un caso diverso, stai effettivamente facendo la dichiarazione due volte. L'errore non è nell'assegnazione o nella definizione, è nella dichiarazione. O si usano le parentesi graffe per creare un nuovo ambito in ciascun caso, o si dichiara semplicemente la variabile una volta, prima del 'cambio', e si rinvia l'assegnazione fino al' caso'. – iluvcapra

risposta

70

aha ...

ho avuto lo stesso problema prima, è sufficiente aggiungere un {} nel tuo caso, tutto il vostro problema sarà risolto.

Come ad esempio:

switch ([weatherCode intValue]) { 
    case 1: 
    { 
     ... 
    } 
     break; 
    case 2: 
    { 
     ... 
    }   
    break; 
} 

Speranza che aiuta.

+4

Sono così fatto con l'obiettivo C/Xcode BS. – Tommyixi

+0

^^^^^^^^^^^^^^^ –

+0

ottima soluzione: D –

7

È necessario parentesi se si desidera inizializzare variabile:

switch ([weatherCode intValue]) { 
     case 1:{ 
      NSString *string = @"hello"; 
     } 
     break; 
     case 2: { 
      .... 
     } 
     break; 
    } 
2

uso di alcune bretelle:

switch ([weatherCode intValue]) { 
     case 1:{ 
      NSString *string = @"hello"; 
     } 
      break; 
     case 2:{ 
      NSString *string = @"hello"; 
     } 
      break; 
    } 
3

provare a farlo in questo modo:

switch ([weatherCode intValue]) { 
    case 1: { 
     ... 
    } 
    break; 
    case 2: { 
     .... 
    } 
    break; 
    ... 

}

1

In l'interruttore, casi agisce come blo ck quindi potresti aver bisogno di impostare il {}. Non è necessario allocare esplicitamente NSString se si utilizza ARC.

switch ([weatherCode intValue]) { 
    case 1: 
    { 
     //your code for case 1 
    } 
     break; 
    case 2: 
    { 
     //your code for case 2 
    }   
    break; 
} 
3

In (Objective-) C (++) le dichiarazioni while(...) { ... }, for(...) { ... }, switch(...) { ...} ecc contengono una singola istruzione blocco (if (...) { ... } else { ... } contiene due). L'ambito delle dichiarazioni all'interno di un blocco è solo quel blocco ed è un errore dichiarare la stessa variabile due volte all'interno di un blocco.

Il blocco di un switch contiene un certo numero di etichette case ...: - etichette non delimitano blocchi, sono solo punti all'interno di un blocco che controllano il flusso può saltare. Ciò rende le istruzioni switch in C diverse da quelle in altre lingue in cui ogni ramo è indipendente (poiché i due blocchi in un if/else sono indipendenti in C). A C switch è solo un "goto calcolato" in un singolo blocco. Ecco perché esiste l'istruzione break;, senza che il flusso di controllo continui da un "ramo" all'altro.

Un'altra conseguenza di questo è che rami diversi non possono dichiarare gli stessi nomi di variabili, diversamente dalle istruzioni if/else.

Infine solo dichiarazioni e non dichiarazioni possono essere etichettati, e come case ...: è una forma di etichetta non ci può essere una dichiarazione subito dopo uno - quindi non è possibile avviare una "succursale" con una dichiarazione.

Se le variabili che si desidera dichiarare all'interno di un ramo devono essere utilizzate solo in quel ramo (come lo sarebbero se dichiarato in uno dei blocchi di un if/else), allora è possibile risolvere tutti i problemi racchiudendo il ramo tra parentesi graffe , { ... }, per trasformarlo in un'istruzione di blocco - i blocchi possono essere etichettati e possono contenere dichiarazioni locali. Per esempio. qualcosa sulla falsariga di:

switch (expr) 
{ 
    case 1: 
     { 
     NSString *var; 
     // use var 
     break; 
     } 

    case 2: 
     { 
     NSNumber *var; 
     // use var 
     break; 
     } 

    ... 
} 
// no var here 

Se si assegnano alle variabili che è necessario utilizzare dopo la switch poi li si deve dichiarare prima del switch, come il corpo di un switch è un blocco e, quindi, una dichiarazione locale scopo. Per esempio. qualcosa sulla falsariga di:

NSString *var = nil; 
switch (expr) 
{ 
    case 1: 
     ... 
     var = ...; 
     break; 

    case 2: 
     ... 
     var = ...; 
     break; 

    ... 
} 
// use var here  

HTH

+0

Eccellente, risposta completa. (Votato) –

Problemi correlati