复制没有空值的 NSDictionary?

Posted

技术标签:

【中文标题】复制没有空值的 NSDictionary?【英文标题】:Copying an NSDictionary without empty values? 【发布时间】:2010-12-03 23:09:07 【问题描述】:

我正在尝试使用dictionaryWithDictionary 方法创建一个NSDictionary。但是,我的第一个 NSDictionary A 可能有一些具有空值的键。如何创建没有任何具有空值的键的 B?我这样做的目的是用与NSDictionary 中的每个非空键对应的行填充UITableView

【问题讨论】:

在这种情况下,什么是“空值”? NSDictionary 不允许 nil 值。 带有空白变量的键。 这仍然没有帮助,字典的值可以是任何东西,NSString、NSNumber,甚至是您自己的自定义类。如果字典不包含特定键的值,则objectForKey: 返回nil。如果您的值是零长度字符串或 [NSNull null] 值,请告诉我们。 Cocoa 中并没有真正意义上的“空白变量”。 我有一组字典,它们在我的属性列表中都有相同的键。我为一些键输入了值。在其他键中,我没有为它们的值输入任何内容。然而密钥存在,我可以在我的 p-list 中看到它。那么如果我没有输入任何内容,它的价值是什么? 【参考方案1】:

这样的事情怎么样:

NSMutableDictionary *destDictionary = [NSMutableDictionary dictionaryWithCapacity:[sourceDictionary count]];
NSEnumerator *keyEnumerator = [[sourceDictionary allKeys] objectEnumerator];
id key;
while ( key = [keyEnumerator nextObject] )
    
    NSString *object = [sourceDictionary objectForKey:key];
    if ([object length] == 0)
        continue;
    [destDictionary setObject:object forKey:key];
    

【讨论】:

糟糕。在我的代码示例中,“对象”以“价值”开始 - 我忽略了将所有“价值”更改为“对象”。样品现已修复。如果您愿意,可以使用 (object == nil) 而不是 (!object)。 很好的例子!不幸的是,它并不完全奏效。我猜只要键存在,对象就存在,即使值都被发送到空白(“”)。我不知道如何解决这个问题。 再次更新。此外,@quixoto 提出了一个很好的观点——我忽略了这一点——该对象不能为 nil。【参考方案2】:

您还可以使用块测试,过滤出值具有长度的键,并从中创建新字典。

NSSet *keySet = [dictionary keysOfEntriesPassingTest:
                 ^(id key, id obj, BOOL *stop) 
                   return (BOOL)[obj length];
                 ];

NSArray *keys = [keySet allObjects];
NSArray *nonEmptyObjects = [dictionary objectsForKeys:keys notFoundMarker:@""];
NSDictionary *newDict = [NSDictionary dictionaryWithObjects:nonEmptyObjects
                                                    forKeys:keys];

【讨论】:

以上是关于复制没有空值的 NSDictionary?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取数据集中具有空值的列的总数? [复制]

NSDictionary 检查 null

NSDictionary 具有空值

在另一列上复制在某些条件下具有空值的列

加入后如何删除具有非空值的重复列? [复制]

如何在 Mongoose 排序结束时保持空值? [复制]