#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
параметр и выполнять правильную проверку ошибок, но это поможет вам начать.
Этот код загрузит список и вернет изменяемый массив, и каждый содержащийся в нем массив и словарь также будут изменяемыми.