是否可以创建从 plist 中读取的对象的可变版本

Is it possible to create mutable versions of objects read in from a plist

我正在我的应用程序中读入一个 plist,它在顶层是一个数组。确保数组以可变

开头很简单
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'。如果 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 和 return 一个可变数组,每个包含的数组和字典也将是可变的。