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

时间:2016-10-07 14:16:08

标签: ios objective-c dictionary plist immutability

我正在阅读我的应用程序中的一个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中读取内容并确保以可变版本的形式读入任何数组或词典?

1 个答案:

答案 0 :(得分:2)

最简单的方法是使用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并返回一个可变数组,每个包含的数组和字典也将是可变的。