如何从NSDictionary中删除<null>?

Tij*_*Kez 0 objective-c nsdictionary nsnull

我正在尝试使用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];
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但这引发了一个例外. *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFDictionary setObject:forKey:]: mutating method sent to immutable object'

但是你可以看到所有的NSDictionaries都是可变的.

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

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

zou*_*oul 5

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

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

至于在枚举字典时改变字典:你无法更改密钥,因为这很容易丢掉枚举代码.但我不明白为什么你不能改变关键值,这就是你所追求的.此代码有效:

NSMutableDictionary *dict = [@{@"foo" : @"bar"} mutableCopy];
for (NSString *key in dict) {
    dict[key] = @"baz";
}
Run Code Online (Sandbox Code Playgroud)

  • 此外,枚举时改变字典是一个错误并抛出异常. (3认同)