是否可以创建从 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 一个可变数组,每个包含的数组和字典也将是可变的。
我正在我的应用程序中读入一个 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 一个可变数组,每个包含的数组和字典也将是可变的。