是否有可能创build从plist读入的对象的可变版本

我正在阅读我的应用程序plist,在顶层是一个数组。 确保数组开始为可变是很简单的

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

数组中的每个元素都是另一个数组,每个数组都包含一个字典。

基于表格单元格select,我正在改变选定索引处字典的属性:

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

我收到错误'-[__NSCFDictionary removeObjectForKey:]: mutating method sent to immutable object'当我尝试更改字典值时, '-[__NSCFDictionary removeObjectForKey:]: mutating method sent to immutable object' 。 如果由plist读入的NSDictionary是不可变的,那么错误是有意义的。

有没有办法从plist中读取内容,并确保任何数组或字典被读作可变版本?

最简单的方法是使用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参数,并做适当的错误检查,但这会让你开始。

此代码将加载plist并返回一个可变数组,每个包含的数组和字典也将是可变的。