我需要检查字典是否有钥匙。如何?


当前回答

是的。这类错误非常常见,会导致应用程序崩溃。所以我使用添加NSDictionary在每个项目如下:

//.h文件代码:

@interface NSDictionary (AppDictionary)

- (id)objectForKeyNotNull : (id)key;

@end

/ /。M文件代码如下

#import "NSDictionary+WKDictionary.h"

@implementation NSDictionary (WKDictionary)

 - (id)objectForKeyNotNull:(id)key {

    id object = [self objectForKey:key];
    if (object == [NSNull null])
     return nil;

    return object;
 }

@end

在代码中,您可以使用如下:

NSStrting *testString = [dict objectForKeyNotNull:@"blah"];

其他回答

if ([[dictionary allKeys] containsObject:key]) {
    // contains key
}

or

if ([dictionary objectForKey:key]) {
    // contains object
}

我喜欢费尔南德斯的回答,尽管你问了两次obj。

这也应该(或多或少与马丁的A相同)。

id obj;

if ((obj=[dict objectForKey:@"blah"])) {
   // use obj
} else {
   // Do something else like creating the obj and add the kv pair to the dict
}

马丁的回答和这个答案都适用于iPad2 iOS 5.0.1 9A405

if ([mydict objectForKey:@"mykey"]) {
    // key exists.
}
else
{
    // ...
}

因为nil不能存储在Foundation数据结构中,NSNull有时表示nil。因为NSNull是一个单例对象,你可以通过直接指针比较来检查NSNull是否是存储在字典中的值:

if ((NSNull *)[user objectForKey:@"myKey"] == [NSNull null]) { }

Objective-C和Clang的最新版本对此有了现代语法:

if (myDictionary[myKey]) {

}

你不需要检查是否与nil相等,因为只有非nil的Objective-C对象可以存储在字典(或数组)中。所有Objective-C对象都是真值。即使@NO, @0,和[NSNull null]计算为真。

编辑:霉霉现在很火。

对于Swift,您可以尝试以下内容

if let value = myDictionary[myKey] {

}

此语法只在myKey在dict中时执行if块,如果在则值存储在value变量中。请注意,这甚至适用于假值,如0。