Как мне обновить объект в NSMutableArray? - PullRequest
11 голосов
/ 30 августа 2011

Я пытаюсь обновить объект в NSMutableArray .

Product *message = (Product*)[notification object];
Product *prod = nil;

for(int i = 0; i < ProductList.count; i++)
{
    prod = [ProductList objectAtIndex:i];
    if([message.ProductNumber isEqualToString:prod.ProductNumber])
    {
        prod.Status = @"NotAvaiable";
        prod.Quantity = 0;
        [ProductList removeObjectAtIndex:i];
        [ProductList insertObject:prod atIndex:i];
        break;
    }
}

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

Ответы [ 5 ]

36 голосов
/ 30 августа 2011

Удалить строки:

[ProductList removeObjectAtIndex:i];
[ProductList insertObject:prod atIndex:i];

и это будет хорошо!

20 голосов
/ 30 августа 2011

Для обновления используйте

- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject

Но в этом случае это не нужно, поскольку вы модифицируете тот же объект.

10 голосов
/ 30 августа 2011

Вы можете начать с использования fast enumeration , который быстрее и проще для чтения. Кроме того, вам не нужно удалять и вставлять объект, вы можете просто отредактировать его в строке. Как это:

Product *message = (Product*)[notification object];

for(Product *prod in ProductList)
{
    if([message.ProductNumber isEqualToString:prod.ProductNumber])
    {
        prod.Status = @"NotAvailable";
        prod.Quantity = 0;
        break;
    }
}   

(Является ли ProductList объектом? Если это так, он должен начинаться со строчной буквы: productList. Имена для заглавных букв предназначены для классов. Кроме того, Status и Quantity являются свойствами и должны начинаться с строчная буква. Я настоятельно рекомендую вам следовать соглашениям о присвоении имен какао .)

6 голосов
/ 18 марта 2015

Используйте -insertObject:atIndex: или replaceObjectAtIndex:withObject:.

5 голосов
/ 30 августа 2011

Существует два подхода

  1. Создать новый объект и заменить старый объект новым объектом
for(int i = 0; i < ProductList.count; i++)         
   {
      prod = [ProductList objectAtIndex:i];
      if([message.ProductNumber isEqualToString:prod.ProductNumber])
       {
           newObj = [[Product alloc] autorelease];
           newObj.Status = @"NotAvaiable";
           newObj.Quantity = 0;
           [ProductList replaceObjectAtIndex:i withObject:newObj];
           break;
       } 

     }

Обновите существующий объект:

for(int i = 0; i < ProductList.count; i++)
    {
        prod = [ProductList objectAtIndex:i];
        if([message.ProductNumber isEqualToString:prod.ProductNumber])
        {
            prod.Status = @"NotAvaiable";
            prod.Quantity = 0;
            break;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...