2009-03-12 11 views

risposta

44

In primo luogo, si potrebbe considerare l'utilizzo di una classe per contenere le stringhe dell'array interno o caricarlo da un file Plist (in cui è facile creare un array di stringhe 2D).

Per le dichiarazioni dirette, hai un paio di opzioni. Se si desidera utilizzare un NSArray, dovrete creare manualmente la struttura come questa:

NSMutableArray *strings = [NSMutableArray array]; 
for(int i = 0; i < DESIRED_MAJOR_SIZE; i++) 
{ 
    [strings addObject: [NSMutableArray arrayWithObject:@"" count:DESIRED_MINOR_SIZE]]; 
} 

Oppure, utilizzando letterali di array, è possibile ottenere un immutabile versione come questo:

NSArray *strings = @[ @[ @"A", @"B", @"C" ], @[ @"D", @"E", @"F" ], @[ @"G", @"H", @"I" ] ] 

è quindi possibile utilizzare in questo modo:

NSString *s = [[strings objectAtIndex:i] objectAtIndex:j]; 

questo è un po 'imbarazzante per inizializzare, ma è la strada da percorrere se si vuole utilizzare i metodi NSArray.

Un'alternativa è quella di utilizzare le matrici C:

NSString *strings[MAJOR_SIZE][MINOR_SIZE] = {0}; // all start as nil 

e quindi utilizzarlo in questo modo:

NSString *s = strings[i][j]; 

Questo è meno imbarazzante, ma bisogna stare attenti a conservare/copia e rilasciano i valori mentre li si inserisce e li si rimuove dall'array. (! A meno che non si sta utilizzando ARC, ovviamente) NSArray avrebbe fatto questo per voi, ma con le matrici C-style, è necessario fare qualcosa di simile per sostituire un array:

[strings[i][j] release]; 
strings[i][j] = [newString retain]; 

L'altra differenza è che si può mettere nil nell'array in stile C, ma non negli NSArrays - per questo devi usare NSNull. Dai anche un'occhiata alla domanda Stack Overflow Cocoa: Memory management with NSString per ulteriori informazioni sulla gestione della memoria NSString.

+2

+1 per avermi salvato un sacco di digitazione. – Abizern

12

Se si vuole dichiarare e inizializzare un array bidimensionale di stringhe, si può fare questo:

NSArray *myArray = [NSArray arrayWithObjects: 
         [NSArray arrayWithObjects:@"item 1-1", @"item 1-2", nil], 
         [NSArray arrayWithObjects:@"item 2-1", @"item 2-2", nil], 
         [NSArray arrayWithObjects:@"item 3-1", @"item 3-2", nil], 
         [NSArray arrayWithObjects:@"item 4-1", @"item 4-2", nil], 
         nil]; 

Questo ha il vantaggio di dare una matrice immutabile.

+0

ciao Steve McLeod, come posso ottenere il valore di "item 1-1" se ho myArray come questo. –

+1

[[myArray objectAtIndex: 1] objectAtIndex: 1] – Hackmodford

2

Potrei essere auto-pubblicitario ma ho scritto un wrapper su NSMutableArray come facile da usare come array 2D. Disponibile su GitHub come CRL2DArray qui. https://github.com/tGilani/CRL2DArray

+0

Proveniente da Android (Java) Sono sorpreso di quanto sia difficile creare un array 2D in obj-C, grazie per l'utilissimo GitHub signore! –

+0

L'unico problema è che vorrei che ci fossero più metodi incorporati che un normale NSArray ha come conteggi, ecc. Ma per ora lo farò manualmente! –

Problemi correlati