2012-06-15 5 views

risposta

7

Non è possibile creare un array come quello che si sta facendo in fase di compilazione. Questo perché non è una "costante di tempo di compilazione". Invece, si può fare qualcosa di simile:

static NSArray *tArray = nil; 

-(void)viewDidLoad { 
    [super viewDidLoad]; 

    tArray = [NSArray arrayWithObjects:@"A", @"B", @"C", nil]; 
} 

se è veramente importante che si dispone di questo precompilato, allora penso che si potrebbe creare un progetto di prova, creare l'array (o qualunque oggetto) è necessario, riempirlo, poi serializzarlo usando NSKeyedArchiver (che lo salverà in un file), quindi includerlo nella tua app. Sarà quindi necessario utilizzare NSKeyedUnarchiver per annullare l'archiviazione dell'oggetto per l'uso. Non sono sicuro di quale sia la differenza di prestazioni tra questi due approcci. Un vantaggio di questo metodo è che non si dispone di un grande blocco di codice se è necessario inizializzare un array che include molti oggetti.

+0

Non è importante averlo precompilato, quindi la tua soluzione funziona perfettamente per me. Grazie! – MoreFamed

+0

Questo crea l'array ogni volta che viene eseguito 'viewDidLoad', un test' nil' sarebbe buono. – Cristik

-1

uso questo

NSArray *array = [NSArray arrayWithObjects:str1,str2, nil]; 
+1

Vale la pena notare che 'str1, str2 ...' possono essere letterali NSString come '@" una stringa "', nello stesso modo in cui sarebbero per un inizializzatore di array C. I * think * tali stringhe saranno in fase di compilazione nell'immagine. Non pensare di poter inizializzare l'array da solo, a parte il runtime, anche se, almeno non senza un brutto attacco di serializzazione. – walkytalky

+0

Questo non funziona per me. Ho fatto NSArray * a = [array NSArrayWithObjects: @ "foo", @ "bar", @ "baz", nil]; e il compilatore dice "L'elemento Initializer non è una costante in fase di compilazione". Ho bisogno di condividere l'array tra più routine in un modulo, quindi voglio che l'array sia dichiarato e compilato all'esterno di qualsiasi routine ... – MoreFamed

+0

-1 Come sottolineato da MoreFamed, questo non funzionerà assolutamente come lui ha bisogno. Il tuo codice * funzionerebbe * se avesse solo bisogno di accedere a 'array' in un unico metodo, ma ha bisogno di accedervi attraverso la sua classe. – FreeAsInBeer

-2

Per quanto ho capito è necessario una matrice tridimensionale È possibile utilizzare i metodi della classe di NSArray .. Per esempio

NSString *yourString; 
NSArray *yourArray = [[NSArray alloc] initWithObjects:yourString, nil]; 

Se avete bisogno di più, per favore fornire ulteriori dettagli sul problema

+0

-1 La tua risposta ha lo stesso problema di @ sheraza. Non fornirà l'accesso alla matrice attraverso l'intera classe. – FreeAsInBeer

-2

Semplice come quello: NSArray<NSString*> *stringsArray = @[@"Str1", @"Str2", @"Str3", ...]; Modern ObjectiveC consente generici e array letterali.

Se si desidera un codice più breve, quindi NSArray *stringsArray = @[@"Str1", @"Str2", @"Str3", ...];, i generici sono facoltativi e aiutano solo quando si accede agli elementi dell'array, quindi è possibile ricondurre in seguito il codice all'array templatizzato.

+1

Non riesco a compilarlo come costante/statico. – Andy

+0

Sì, non funzionerà in quanto è una costruzione eseguita in runtime. – Cristik