Objective C — Не удается изменить значение в NSMutableArray

#ios #objective-c

#iOS #objective-c

Вопрос:

Я могу извлечь нужные мне данные из API, но тогда я не могу изменить значения NSMutableArray. Вот данные, которые я получаю из API:

 {
favorites =     (
            {
        id = 766;
        imageUrl = "766.jpg";
        name = "Ground Beef 93% Lean 1LB PKG";
        price = "5.99";
        qty = 5;
        sale = "<null>";
        switch = 1;
    },
            {
        id = 3270;
        imageUrl = "3270.jpg";
        name = "Arnold Premium Italian Bread 20oz PKG";
        price = "5.39";
        qty = 5;
        sale = "<null>";
        switch = 1;
    },...
);
success = true;
}
  

Я объявляю свойство favorites в части интерфейса :

 @property (nonatomic, retain) NSMutableArray *favorites;
  

Я храню данные в NSMutableArray следующим образом :

 NSError *myError = nil;
NSMutableArray *response = [[NSJSONSerialization JSONObjectWithData:self.responseData options:NSJSONReadingMutableLeaves error:amp;myError] mutableCopy];
  

Затем я сохраняю любимые продукты в другом объекте NSMutableArray :

 NSString *success = [response valueForKey:@"success"];
if([success isEqualToString:@"true"]) {
    self.favorites = [response valueForKey:@"favorites"];
}
  

С помощью этих данных я могу отобразить все изображения, цены и т.д. в таблице.
Проблема в том, что я хочу обновить значения в изменяемом массиве self.favorites:

 [self.favorites[indexPath.row] setObject:@"0" forKey:@"switch"];
  

Я получаю эту ошибку: -[__NSCFDictionary setObject:forKey:]: изменяющий метод, отправленный в неизменяемый объект.
Я даже пытался добавить изменяемую копию при назначении массива избранному :

 self.favorites = [[response valueForKey:@"favorites"] mutableCopy];
  

но это тоже не сработало.

Комментарии:

1. Ваш массив изменчив, но содержащиеся в нем словари остаются неизменяемыми.

2. Как сказал @rmaddy. Мне нужны NSJSONReadingMutableContainers, это то, что делает словари изменяемыми.

Ответ №1:

Вы хотите NSJSONReadingMutableContainers , а не NSJSONReadingMutableLeaves .

Использование NSJSONReadingMutableLeaves дает вам изменяемые строки и другие изменяемые объекты внутри контейнеров. Не то, что вам здесь нужно.