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

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

Ответы [ 3 ]

44 голосов
/ 12 марта 2009

Во-первых, вы можете рассмотреть возможность использования класса для хранения строк вашего внутреннего массива или загрузки его из файла 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, но не в NSArrays - для этого вам нужно использовать NSNull. Также взгляните на вопрос переполнения стека Какао: Управление памятью с помощью NSString для получения дополнительной информации об управлении памятью NSString.

12 голосов
/ 08 июля 2009

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

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

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

2 голосов
/ 21 апреля 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...