iPhone - блокировка перечисления - PullRequest
2 голосов
/ 24 февраля 2011

У меня есть массив с несколькими объектами, и я хочу добавить 90.0 к каждому значению. Я хочу сделать это, используя перечисление. Затем я создаю это:

[myArray enumerateObjectsWithOptions:NSEnumerationConcurrent
     usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

     double aValue = [obj doubleValue];                      
     aValue += 90.0;
     obj = [NSNumber numberWithDouble:aValue];
}];

мой вопрос касается последней строки. Я получаю значение объекта, добавляю 90, а затем я должен сохранить его обратно. Поскольку это немного странно, поскольку я работаю на уровне объекта, я не был уверен, что в третьей строке задан правильный синтаксис для сохранения обновленного значения в объекте. Xcode жалуется, что «obj» никогда не используется, потому что он думает, что я присваиваю номер obj с намерением использовать его, но я просто сохраняю значение обратно.

Это правильно?

Ответы [ 3 ]

2 голосов
/ 24 февраля 2011

obj не является ссылкой или указателем, вы не можете сохранить его обратно.NSArray не поддерживает эту функцию.Что вы можете сделать, это вместо хранения NSNumbers, сохранить указатели на NSNumber (то есть NSNumber **) и обновить ссылку на новый объект.

Сохранение ваших чисел в обычном массиве double[] также будет работать.

1 голос
/ 24 февраля 2011

Лучшим способом было бы сохранить измененные значения в новом массиве:

NSMutableArray *newArray = [[NSMutableArray alloc] initWithCapacity:[myArray count]];
__block newArray;
[myArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

 double aValue = [obj doubleValue];                      
 aValue += 90.0;
 [newArray insertObject:[NSNumber numberWithDouble:aValue] atIndex:idx];
}];

note Я набрал это прямо, поэтому прошу прощения за любые синтаксические ошибки.

0 голосов
/ 28 февраля 2011

Если вы хотите выполнить операцию на месте, вы можете использовать это:

[myArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id obj, NSUInteger idx, BOOL *stop) 
{
    double aValue = [obj doubleValue];                      
    aValue += 90.0;
    [myArray replaceObjectAtIndex:idx withObject:[NSNumber numberWithDouble:aValue]];
}];

Хотя NSMutableArray не должен быть потокобезопасным, обычно это происходит только в том случае, если вы меняете его размер.Сработал нормально в простом тесте, но пользуюсь на свой страх и риск.

...