2009-03-12 3 views
25

Как объявить двумерный массив строкового типа в Objective-C?Как объявить двумерный массив типа строки в Objective-C?

+0

Если вы говорите, что NS (Mutable) Array, вы не «объявляете» его. NSArray не имеет назначенного типа содержимого, поэтому вы просто объявляете внешний массив. Как вы это используете, зависит от вас. –

ответ

44

Во-первых, вы можете подумать о том, чтобы использовать класс для хранения строк внутреннего массива или загрузки его из файла plist (в котором легко создать 2-мерный массив строк).

Для прямых объявлений у вас есть несколько вариантов. Если вы хотите использовать NSArray, вам придется вручную создать структуру, как это:

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

Или, используя литералы массивов, вы можете получить непреложный версию так:

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

вы можете использовать его как это:

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

Это несколько неудобно для инициализации, но это путь, если вы хотите использовать методы NSArray.

Альтернативой является использование C массивы:

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

, а затем использовать его как это:

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

Это менее неудобно, но вы должны быть осторожны, чтобы сохранить/копировать и выведите значения, когда вы их вставляете и удаляете из массива. (! Если вы не используете ARC, конечно) NSArray бы сделать это для вас, но с массивами C-стиле, вам нужно сделать что-то вроде этого, чтобы заменить массив:

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

Другим отличием является то, что вам может положить nil в массив C-style, но не NSArrays - вам нужно использовать NSNull для этого. Также рассмотрите вопрос о переполнении стека Cocoa: Memory management with NSString для получения дополнительной информации об управлении памятью NSString.

+2

+1 для сохранения много ввода. – Abizern

12

Если вы хотите объявить и инициализировать двумерный массив строк, вы можете сделать это:

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

Это имеет преимущество, что дает вам неизменный массив.

+0

hi Steve McLeod, как я могу получить значение «item 1-1», если у меня есть myArray вот так. –

+1

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

2

Я мог бы быть саморекламой, но я написал обертку поверх NSMutableArray для простоты использования в качестве 2D-массива. Он доступен на GitHub как CRL2DArray здесь. https://github.com/tGilani/CRL2DArray

+0

Из Android (Java) Я удивлен, как трудно создать 2D-массив в obj-C, благодаря очень полезному GitHub! –

+0

Единственная проблема в том, что я хочу, чтобы было больше встроенных методов, которые обычный NSArray имеет значение count и т. Д. Но сейчас я просто сделаю это вручную! –