【问题标题】:Is it possible to create mutable versions of objects read in from a plist是否可以创建从 plist 读取的对象的可变版本
【发布时间】:2017-02-16 13:57:04
【问题描述】:

我正在将一个 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 中读入内容并确保任何数组或字典都作为可变版本读入?

【问题讨论】:

  • 提供的代码不完整。你在哪里使用 - removeObjectForKey?
  • 你能展示你如何遍历字典/数组的代码吗?
  • “mutableCopy”中没有将每个子级别对象转换为可变版本的构建。 mutableCopy 只在调用它的顶层执行它。
  • @SamB 我添加了触发崩溃/错误的代码行

标签: ios objective-c dictionary plist immutability


【解决方案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 参数并进行适当的错误检查,但这会让您入门。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 2012-07-15
    • 2021-08-18
    相关资源
    最近更新 更多