Можно ли создавать изменяемые версии объектов, считываемых из списка

#ios #objective-c #dictionary #plist #immutability

#iOS #objective-c #словарь #список #неизменность

Вопрос:

Я читаю в своем приложении список, который на верхнем уровне представляет собой массив. Достаточно просто убедиться, что массив начинается как изменяемый

 self.plistData = [[NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"myDataSource" ofType:@"plist"]] mutableCopy];
  

Внутри каждого элемента массива находится другой массив, каждый из которых содержит словарь.

На основе выбора табличной ячейки я меняю атрибуты для словаря по выбранному индексу:

 [self.cellDescriptors[indexPath.section][indexOfTappedRow] setValue:@"YES" forKey: @"isSelected"];
  

Я получаю сообщение об ошибке '-[__NSCFDictionary removeObjectForKey:]: mutating method sent to immutable object' при попытке изменить значение словаря. Ошибка имеет смысл, если NSDictionary, считываемый plist, является неизменяемым.

Есть ли какой-либо способ считывать содержимое из списка и убедиться, что любые массивы или словари считываются как изменяемые версии?

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

1. Предоставленный код является неполным. Где вы используете — removeObjectForKey ?

2. можете ли вы показать код того, как вы выполняете итерацию по словарю / массиву?

3. В «mutableCopy» нет сборки, которая преобразует каждый объект подуровня в изменяемые версии. mutableCopy делайте это только на верхнем уровне, где он вызывается.

4. @SamB Я добавил строку кода, которая вызывает сбой / ошибку

Ответ №1:

Самый простой подход заключается в использовании NSPropertyListSerialization и передаче правильных параметров для получения изменяемых контейнеров.

 NSString *path = [[NSBundle mainBundle] pathForResource:@"myDataSource" ofType:@"plist"];
NSData *data = [NSData dataWithContentsOfFile:path];
NSMutableArray *array = [NSPropertyListSerialization propertyListWithData:data options:NSPropertyListMutableContainers format:nil error:nil];
self.plistData = array;
  

В идеале вы будете использовать error параметр и выполнять правильную проверку ошибок, но это поможет вам начать.

Этот код загрузит список и вернет изменяемый массив, и каждый содержащийся в нем массив и словарь также будут изменяемыми.