Ios 检查密钥是否存在于NSDictionary中

Ios 检查密钥是否存在于NSDictionary中,ios,objective-c,iphone,nsdictionary,Ios,Objective C,Iphone,Nsdictionary,如何检查是否存在此问题 [[dataArray objectAtIndex:indexPathSet.row] valueForKey:@"SetEntries"] 我想知道这把钥匙是否存在。我该怎么做 非常感谢:) 编辑: dataArray中有对象。这些对象是NSDictionary。检查是否为零: if ([[dataArray objectAtIndex:indexPathSet.row] valueForKey:@"SetEntries"] != nil) { // SetE

如何检查是否存在此问题

[[dataArray objectAtIndex:indexPathSet.row] valueForKey:@"SetEntries"]
我想知道这把钥匙是否存在。我该怎么做

非常感谢:)

编辑: dataArray中有对象。这些对象是NSDictionary。

检查是否为零:

if ([[dataArray objectAtIndex:indexPathSet.row] valueForKey:@"SetEntries"] != nil) {
    // SetEntries exists in this dict
} else {
    // No SetEntries in this dict
}

我假设
[dataArray objectAtIndex:indexPathSet.row]
正在返回一个,在这种情况下,您只需对照
nil检查
valueForKey
的结果即可。

例如:

if ([[dataArray objectAtIndex:indexPathSet.row] valueForKey:@"SetEntries"] != nil) {
    // The key existed...

}
else {
    // No joy...

}

我知道您已经选择了答案,但我发现这在
NSDictionary
上作为一个类别非常有用。在这一点上,你开始用所有这些不同的答案来提高效率。Meh…第6页,共1页

- (BOOL)containsKey: (NSString *)key {
     BOOL retVal = 0;
     NSArray *allKeys = [self allKeys];
     retVal = [allKeys containsObject:key];
     return retVal;
}
这是正确的答案。

试试这个:

if ([dict objectForKey:@"bla"]) {
   // use obj
} else {
   // Do something else like create the object
}

这一个也有相同的功能,但代码较少:

if (dataArray[indexPathSet.row][@"SetEntries"] != nil) { /* the key exists */        } 
else                                                   { /* the key doesn't exist */ }

这也适用于使用Objective-C文本并使用以下语法:

NSDictionary *dict = @{ @"key1" : @"value1", @"key2" : @"value2" };
if (dict[@"key2"])
NSLog(@"Exists");
else
NSLog(@"Does not exist");

检查字典是否包含任何值。我更喜欢[dic allKeys]。计数>0进行检查。

使用
(无符号长)
选项:

if ( (unsigned long)[[dataArray objectAtIndex:indexPathSet.row] valueForKey:@"SetEntries"] ) {
    // Key exist;
}else{
    // Key not exist;
};

您使用
-valueForKey:
而不是
-objectForKey:
的原因是什么?前者用于键值编码,略慢于后者。我在我的类别中也编写了相同的方法,但在使用UIImageWriteToSavedPhotosAlbum()时发生了奇怪的崩溃。缩小范围后,我将方法名从containsKey=>hasKey更改,崩溃消失了这比公认的答案要好得多。我想按一个键进行搜索,而不是按键的值是否为零进行搜索。您可以在字典中有一个指向nil值的键。但关键是存在的。公认的答案不包括这种情况。但是这里的解决方案是这样的。@Hooman:对于值为nil的键,这是不正确的:NSDictionary文档()的第二段指出“键和值都不能为nil;如果需要在字典中表示null值,则应使用NSNull。”这一点和公认的答案都适用于您的场景,例如,使用字典,其中某个键的值为null(类型为NSNull)。或者:return[[self-allKeys]containsObject:key]?是:不是;很好的召唤,@Jamo。我会避开这个答案。我的猜测是,在封面下,对allKeys的调用和对containsObject的调用都至少是O(n),而valueForKey可能要少得多。这可能是一个技术上正确的解释,但您将更好地服务于社区(并可能获得更多的投票)如果你在回答的正文中对你的推理进行更详细的讨论。为什么使用
objectForKey:
而不是其他方法是合适的?为什么不显式地检查一个值?至少,使用问题中提供的代码示例可以更容易地将您的示例与原始问题联系起来。从BOOL到NSNull*的转换是为了什么?对于下面的swift版本,代码起作用。let headers:Dictionary=httpResponse.allHeaderFields if(headers[“errorcode”!=nil){print(“错误键存在”)}该键的值也可以是nil,因此这种方法不会完全测试密钥是否存在于dictionary@AndreiA.You无法将nil添加到NSDictionary。该键的值也可以为nil,因此此方法不会完全测试该字典中是否存在键dictionary@AndreiA. 在NSDictionary中,键和值都不能是
nil
。要表示nil,可以使用NSNull。
if ( (unsigned long)[[dataArray objectAtIndex:indexPathSet.row] valueForKey:@"SetEntries"] ) {
    // Key exist;
}else{
    // Key not exist;
};