2010-12-09 3 views
1

Например: у меня есть изменяемый массив BOOL (или [NSNumber numberWithBool: TRUE];). , а затем я хочу изменить, например, первое значение в этом массиве FALSE.Изменение значений внутри массива

[array addObject:[NSNumber numberWithBool:TRUE]]; 
[array objectAtIndex:0] ??? 

Я знаю довольно странный способ выполнения этой задачи.

[array replaceObjectAtIndex:0 withObject:[NSNumber numberWithBool:FALSE]]; 

Да, это полностью удовлетворяет меня, но я ищу другой способ, который более прост, чем этот. Что-то вроде [[array objectAtIndex:0] setBoolValue:FALSE]; например, представьте, если бы у меня был UIButton вместо BOOLs: [[array objectAtIndex:0] setHidden:TRUE]; или это только мечты?

Заранее благодарен!

ответ

10

Лучший способ сделать это

[array replaceObjectAtIndex:0 withObject:[NSNumber numberWithBool:FALSE]]; 

Причина в том, что [array objectAtIndex:0] возвращает NSNumber, в отличие, если у вас массив UIButton с который будет возвращать UIButton объект, который вы могли бы работать на. Поскольку вы получаете NSNumber взамен, вы не можете сделать ничего, чтобы сделать NSNumber напрямую, так как он не имеет методов, которые вам нужны, поэтому вам придется работать с массивом, который содержит NSNumber.

+0

О, теперь это ясно для меня. Кажется, что NSNumber просто не имеет такого метода. – 0xDE4E15B 2010-12-09 20:40:53

+0

Я попытался использовать `replaceObjectAtIndex` в NSMutableArray из NSMutableStrings, и я получаю сообщение об ошибке« непризнанный селектор, отправленный в экземпляр ». Есть ли что-нибудь особенное, что вам нужно сделать, когда это массив строк? Я также понимаю, что это довольно старый поток, возможно ли, что что-то изменилось с тех пор, как это было написано (я использую ARC, так что может ли это что-то не выпускать)? – GeneralMike 2012-09-26 16:47:13

2

Ничего не мешает вам отправлять мутирующие сообщения объекту в массиве, но NSNumber просто не изменен. Вот почему вам нужно заменить номер объекта другим. Это не связано с массивом или языком - вы просто не можете изменить NSNumber.

0

Что-то понять здесь: Массивы - это простые коллекции указателей на объект. Следовательно, вы можете легко найти такие вещи, как
((UIButton*)[array objectAtIndex:0]).hidden=TRUE;
Возможно изменение и изменение объекта. Но, обменивая один объект на другой, вам нужно использовать методы замены, как вы указали. Однако более простые объекты, как сказано выше, @Chuck, просто не изменяются (например, NSNumber).

Также обратите внимание, что мой код, приведенный выше, является ужасным с точки зрения стабильности. Как вы, конечно, знаете, что это UIButton, который вы вытаскиваете из своей волшебной шляпы (т. Е. Массив?)

Смежные вопросы