我正在尝试使用不允许空值的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都是可变的。
怎么了? 有更好的方法吗?
编辑:将新版本移至单独的答案。
答案 0 :(得分:5)
你怎么知道这些词典是可变的?看起来他们不是。在枚举期间将它们键入NSMutableDictionary
并不会使它们变得可变。您可以遍历字典并将密钥移动到一个新的,可变的密钥中,过滤空值。
此外,如果您的词典来自NSJSONSerialization
,请查看NSJSONReadingOptions
,可以选择使用可变容器作为反序列化结构。这并不总是一个好的解决方案,但值得一试。
对于在枚举字典时改变字典:您无法更改密钥,因为这很容易丢失枚举代码。但我不明白为什么你不能改变关键值,这就是你所追求的。此代码有效:
NSMutableDictionary *dict = [@{@"foo" : @"bar"} mutableCopy];
for (NSString *key in dict) {
dict[key] = @"baz";
}
答案 1 :(得分: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;