2009-03-12 6 views

Respuesta

44

En primer lugar, puede considerar el uso de una clase para mantener las cadenas de su matriz interna o cargarla desde un archivo plist (en el cual es fácil hacer una 2da serie de cadenas).

Para declaraciones directas, tiene un par de opciones. Si desea utilizar una NSArray, que tendrá que crear manualmente la estructura como esta:

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

O, usando literales de matriz, se puede obtener una versión inmutable así:

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

a continuación, puede utilizar de esta manera:

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

esto es algo torpe para inicializar, pero es el camino a seguir si desea utilizar los métodos NSArray.

Una alternativa es utilizar C matrices:

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

y luego usarlo como esto:

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

Esto es menos difícil, pero hay que tener cuidado de conservan/copia y liberan los valores a medida que los coloca y los elimina del conjunto. (! A menos que estés usando ARC, por supuesto) NSArray haría esto para usted, pero con arreglos de tipo C, que tiene que hacer algo como esto para reemplazar una matriz:

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

La otra diferencia es que se puede poner nil en la matriz de estilo C, pero no en las NSArrays, necesita usar NSNull para eso. También consulte la Pregunta de desbordamiento de pila Cocoa: Memory management with NSString para obtener más información sobre la gestión de memoria NSString.

+2

+1 por salvarme un montón de tipeo. – Abizern

12

Si desea declarar e inicializar una matriz bidimensional de cadenas, se puede hacer esto:

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]; 

Esto tiene la ventaja de que le da un conjunto inmutable.

+0

hola Steve McLeod, ¿cómo puedo obtener valor del "elemento 1-1" si tengo myArray así? –

+1

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

2

Podría ser auto-publicidad, pero escribí un contenedor sobre NSMutableArray para facilitar su uso como una matriz 2D. Está disponible en GitHub como CRL2DArray aquí. https://github.com/tGilani/CRL2DArray

+0

Procedente de Android (Java) Me sorprende lo difícil que es crear una matriz 2D en obj-C, gracias por el muy útil señor GitHub. –

+0

El único problema es que me gustaría que hubiera más métodos integrados que un NSArray normal tiene como contar, etc. ¡Pero por ahora solo lo haré manualmente! –

Cuestiones relacionadas