我有一些带有几把钥匙的NSDictionary,但是他们在雇佣部门的部门很多,例如:
所以你可以看看我是否在nsdictionary中插入它,最初我只有两个键作为“Person”和“Location”,但是我试图迭代每个键来检查空值并将其设置为@“”空字符串。
有谁知道如何迭代这样的部门?
由于
答案 0 :(得分:6)
您无法在nil
中存储NSDictionary
。要么你正在寻找[NSNull null]
,要么你会找到缺少你正在寻找的钥匙的字典....
enumerateKeysAndObjectsUsingBlock:
比for( ... in ...)
快。
如果要修改字典的内容,则必须使用可变字典。如果从属性列表中取消归档,则可以选择使用不可变节点创建可变容器(这可能是您想要的)。
Recurse是答案,但是没有显示递归的答案是正确的。
- (void)filterMutableDictionary:(NSMutableDictionary*)aDictionary
{
// check if aDictionary is missing any keys here
if (![aDictionary objectForKey:@"DesiredKey"]) {
... fill in key/value here ...
}
// enumerate key/values, filtering appropriately, recursing as necessary
[aDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) {
if ([value isKindOfClass: [NSMutableDictionary class]]) {
[self filterMutableDictionary: value];
} else {
... filter value here ...
}
}];
}
答案 1 :(得分:5)
以最简单的形式:
[dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
if ([obj isKindOfClass:[NSNull class]]) [dictionary setValue:[NSString stringWithString:@""] forKey:key];
} ];
答案 2 :(得分:2)
您可以使用递归方法,如下所示:
- (void)recursive:(NSDictionary*)aDictionary {
for (id key in aDictionary) {
id value = [aDictionary objectForKey:key];
if ([value isKindOfClass:[NSDictionary class]]) {
[self recursive:value];
} else {
// Do something else, the value is not a dictionary
}
}
}
答案 3 :(得分:0)
在检查值时,在循环内部使用它来检查null。
if ([[dict objectForKey:@"Gender"] isKindOfClass:[NSNull class]]) {
// null value
myGender = @"";
}
答案 4 :(得分:0)
- (void)recursive:(NSDictionary)dictionary {
for (NSString *key in [dictionary allKeys]) {
id nullString = [dictionary objectForKey:key];
if ([nullString isKindOfClass:[NSDictionary class]]) {
[self recursive:(NSDictionary*)nullString];
} else {
if ( (NSString*)nullString == nil)
[dictionary setObject:@"" forKey:@"key"];
}
}
}