0

我正在尝试使用NSArray不允许空值的 NSDictionaries 的 writeToFile 方法。我想只是循环并找到它们并用空替换,NSString但我无法让它工作。这就是我正在尝试的。

编辑: NSArrays 和 NSDictionaries 由 NSJSONSerialization 创建。

for (NSMutableDictionary *mainDict in mainArray)
{
    for(NSMutableDictionary *subDict in mainDict)
    {
        for(NSString *key in subDict)
        {                
            id value = [subDict objectForKey:key];

            if (value == [NSNull null])
            {
                [subDict setObject:@"" forKey:key];
            }
        }
    }
}

但这会引发异常。*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFDictionary setObject:forKey:]: mutating method sent to immutable object'

但正如您所见,所有 NSDictionaries 都是可变的。

这是怎么回事?有一个更好的方法吗?

编辑:将新版本移至单独的答案。

4

2 回答 2

5

你怎么知道字典是可变的?看起来他们不是。在枚举期间键入它们NSMutableDictionary不会使它们可变。您可以遍历字典并将键移动到一个新的、可变的中,过滤空值。

此外,如果您的字典来自NSJSONSerialization,请查看NSJSONReadingOptions,可以选择将可变容器用于反序列化结构。这并不总是一个好的解决方案,但值得一试。

至于在枚举字典时对其进行变异:您不能更改键,因为这很容易摆脱枚举代码。但我不明白为什么你不能改变键值,这就是你所追求的。此代码有效:

NSMutableDictionary *dict = [@{@"foo" : @"bar"} mutableCopy];
for (NSString *key in dict) {
    dict[key] = @"baz";
}
于 2012-11-17T09:05:43.807 回答
0

或者重建整棵树的作品。

NSMutableArray *newMainArray = [[NSMutableArray alloc] init];
for (NSArray *subArray in self.mainArray)
{
    NSMutableArray *newSubArray = [[NSMutableArray alloc] init];
    for(NSDictionary *dict in subArray)
    {
        NSMutableDictionary *newDict = [[NSMutableDictionary alloc] init];
        for(NSString *key in dict)
        {              
            id value = [dict objectForKey:key];
            if (value == [NSNull null])
            {
                [newDict setObject:@"" forKey:key];
            } else {
                [newDict setObject:value forKey:key];
            }
        }
        [newSubArray addObject:newdict];
        [newDict release];
    }
    [newMainArray addObject:newSubArray];
    [newSubArray release];
}
[self.mainArray release];     <----  ????
self.mainArray = newMainArray;
于 2012-11-18T21:56:15.793 回答