Доступ Objective C / изменяющий элементы массива в многомерном массиве (NSArray)

Я пытаюсь изменить значение в многомерном массиве, но получаю ошибку компилятора:

warning: passing argument 2 of 'setValue:forKey:' makes pointer from integer without a cast

Это - мой довольный массив:

NSArray *tableContent = [[NSArray alloc] initWithObjects:
                [[NSArray alloc] initWithObjects:@"a",@"b",@"c",nil],
                [[NSArray alloc] initWithObjects:@"d",@"e",@"f",nil],
                [[NSArray alloc] initWithObjects:@"g",@"h",@"i",nil],
                 nil];

Это - то, как я пытаюсь изменить значение:

[[tableContent objectAtIndex:0] setValue:@"new value" forKey:1];

Решение:

 [[tableContent objectAtIndex:0] setValue:@"new val" forKey:@"1"];

Таким образом, ключ массива является строковым типом - довольно странный, но хороший для знания.

5
задан dan 18 January 2010 в 20:17
поделиться

3 ответа

Мне кажется, что первым (и, вероятно, самым большим) шагом для достижения достойной эффективности является минимизация копирования данных. Так как вы даете данные в char [] с длиной, моей первой тенденцией будет начать с создания strstream с использованием этого буфера. Тогда вместо копирования последовательности за раз в другой поток (или stringstream) я бы копировал последовательности по одной в поток, который вы будете использовать, чтобы записать их в выходные данные.

Если вам разрешено изменять содержимое буфера, другой возможностью будет разбор буфера на строки путем простой замены каждого\n 'на '\0'. Если вы собираетесь сделать это, вы обычно хотите создать вектор (deque и т.д.) указателей на начало каждой строки (то есть найти первый '\r 'или '\n' и заменить его на '\0 '. Далее, следующей вещью, отличной от '\r 'или '\n', является начало следующей строки, поэтому ее адрес в векторе).

Я бы также серьезно подумал о том, сможете ли вы избежать линейного вывода. Чтение через большой буфер для поиска новых строк происходит относительно медленно. Если вы собираетесь в конечном итоге писать одну строку за другой в любом случае, вы можете избежать всего этого, просто записывая в весь буфер в выходной поток и делая с ним.

-121--3753654-

Похоже, что необходимо сопоставить одно определение класса с другим.

Это можно сделать вручную (с помощью большого количества шаблонного кода) или автоматически с помощью инструмента, такого как AutoMapper .

-121--4321220-
NSMutableArray *tableContent = [[NSMutableArray alloc] initWithObjects:
                    [NSMutableArray arrayWithObjects:@"a",@"b",@"c",nil],
                    [NSMutableArray arrayWithObjects:@"d",@"e",@"f",nil],
                    [NSMutableArray arrayWithObjects:@"g",@"h",@"i",nil],
                     nil];

[[tableContent objectAtIndex:0] replaceObjectAtIndex:1 withObject:@"new object"];

Вы не хотите alloc + init для подмастерьев, так как количество сохраняемых подмастерьев будет слишком большим (+ 1 для alloc , затем + 1 снова при вставке во внешний массив).

11
ответ дан 18 December 2019 в 13:14
поделиться

Вы создаете неизменные массивы и пытаетесь изменить значения, хранящиеся в них. Вместо этого используйте NSMutablearRay.

2
ответ дан 18 December 2019 в 13:14
поделиться

Вам нужно либо NSMutableArray's insertObject:atIndex:, либо replaceObjectAtIndex:withObject: (первый сдвинет назад существующий элемент, если он уже существует, в то время как второй заменит его, но не работает для индексов, которые еще не заняты). Сообщение setValue:forKey: принимает тип значения для первого аргумента и NSString для второго. Вы передаете целое число, а не NSString, которое никогда не является действительным.

1
ответ дан 18 December 2019 в 13:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: