Как объявить двумерный массив строкового типа в Objective-C?
Как объявить двухмерный массив строкового типа в Objective-C?
Ответ 1
Во-первых, вы можете подумать о том, чтобы использовать класс для хранения ваших внутренних строк массива или загрузки его из файла plist (в котором легко сделать 2d-массив строк).
Для прямых объявлений у вас есть несколько вариантов. Если вы хотите использовать 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: Управление памятью с помощью NSString для получения дополнительной информации об управлении памятью NSString.
Ответ 2
Если вы хотите объявить и инициализировать двумерный массив строк, вы можете сделать это:
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];
Это даст вам неизменный массив.
Ответ 3
Я мог бы быть саморекламой, но я написал обертку поверх NSMutableArray
для легкого использования в качестве 2D-массива. Он доступен на GitHub как CRL2DArray
здесь. https://github.com/tGilani/CRL2DArray