Я пытаюсь изменить значение в многомерном массиве, но получаю ошибку компилятора:
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"];
Таким образом, ключ массива является строковым типом - довольно странный, но хороший для знания.
Мне кажется, что первым (и, вероятно, самым большим) шагом для достижения достойной эффективности является минимизация копирования данных. Так как вы даете данные в 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 снова при вставке во внешний массив).
Вы создаете неизменные массивы и пытаетесь изменить значения, хранящиеся в них. Вместо этого используйте NSMutablearRay.
Вам нужно либо NSMutableArray's insertObject:atIndex:
, либо replaceObjectAtIndex:withObject:
(первый сдвинет назад существующий элемент, если он уже существует, в то время как второй заменит его, но не работает для индексов, которые еще не заняты). Сообщение setValue:forKey:
принимает тип значения для первого аргумента и NSString для второго. Вы передаете целое число, а не NSString, которое никогда не является действительным.