Запутался в перечислении ... Как изменить объекты, которые во время перечисления? - PullRequest
2 голосов
/ 06 октября 2011

Все еще новичок в Objective-C, и я запутался в перечислении ...

Допустим, у меня есть NSArray из 8 объектов "Car", и у каждого из них свойство "paintColor" установлено в "красный. Я хочу перечислить через массив и установить каждое свойство Car.paintColor на "синий". Как мне это сделать?

for (Car *car in myArray){
    car.paintColor = @"blue";  
}

Но тогда, если я сделаю

Car *testCar = [myArray objectAtIndex:2];

NSLog(@"The car color for 3rd object in myArray is %@", testCar.color);

Я все еще получаю «красный». Так что, кажется, перечисление просто создает временный объект, но не изменяет фактический объект, который содержится в массиве.

Как правильно сделать то, что я пытаюсьчтобы сделать? У меня есть много ситуаций, когда я хочу перечислить через массив, но на самом деле изменяет элементы, которые находятся внутри массива

Спасибо

- EDIT

Хорошо,спасибо за эту информацию ... вы можете объяснить, почему это не работает?

У меня есть NSArray с именем "carsArray", настроенный как свойство, которое содержит три строковых объекта NSMutable ("Buick", "Bronco",«Кадиллак»).

Я тогда делаю

for (NSMutableString *car in myArray) {
    car = [NSMutableString stringWithFormat:@"test"];
}

NSMutableString *temp = [myArray objectAtIndex:2];
NSLog(@"third car is %@", temp);

NSLog говорит "Кадиллак".Разве это не должно быть "тест"?

Ответы [ 2 ]

2 голосов
/ 06 октября 2011

Чтобы делать то, что вы хотите:

for (NSMutableString *car in myArray) {
    [car setString:[NSMutableString stringWithFormat:@"test"]];
}

Базовое понимание указателей.Это не особенно перечисление, которое заставляет это работать таким образом.

NSMutableString *car1 = [NSMutableString stringWithFormat:@"Cadillac"];
NSMutableString *car = car1;
[car setString:[NSMutableString stringWithFormat:@"Ford"]];
NSLog(@"car1 = %@", car1);

// Ford

car = [NSMutableString stringWithFormat:@"Buick"];
NSLog(@"car1 = %@", car1);

// Ford

Когда вы устанавливаете car = car1, car является «псевдонимом» для car1.Вы можете установить свойства на машине, и свойства будут установлены на машине1.Вы можете вызывать такие методы, как setString для car, метод будет вызываться для car1.car и car1 являются указателями, они указывают на один и тот же объект.

Когда вы присваиваете новое значение для автомобиля, оно просто делает его псевдонимом для другого объекта, а не для того же объектакак автомобиль1.Назначение не повлияет на car1, и никакие методы доступа к ним или методы, которые вы будете использовать после этого для машины.

Перечисление эффективно выполняет car = myArray[0], car = myArray[1], car = myArray[2] в свою очередь.(Сокращение: myArray[0] неверный синтаксис Objective-C.)

2 голосов
/ 06 октября 2011

Быстрое перечисление не копирует объекты и не создает временные копии.NSArray - это массив указателей на объекты.Быстрое перечисление просто проходит по этому списку указателей, и каждый раз через цикл вы получаете следующий указатель.Указатель указывает на тот же объект, на который указывает массив.

То, как вы изменяете содержимое объекта в быстром цикле перечисления, прекрасно.

Ваша проблема в другом месте (см. Комментарий Маттии).

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