如何检查NSDictionary或NSMutableDictionary是否包含密钥?

纵饮孤独 提交于 2020-02-26 17:12:25

我需要检查dict是否有密钥。 怎么样?


#1楼

是。 这种错误很常见,导致应用程序崩溃。 所以我用它在每个项目中添加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"];

#2楼

一个非常讨厌的问题,只是浪费了我的一些时间调试 - 你可能会发现自己提示自动完成尝试使用似乎工作的doesContain

除此之外, doesContain使用一个ID比较,而不是使用哈希比较objectForKey所以,如果你有字符串键的字典将返回NO的doesContain

NSMutableDictionary* keysByName = [[NSMutableDictionary alloc] init];
keysByName[@"fred"] = @1;
NSString* test = @"fred";

if ([keysByName objectForKey:test] != nil)
    NSLog(@"\nit works for key lookups");  // OK
else
    NSLog(@"\nsod it");

if (keysByName[test] != nil)
    NSLog(@"\nit works for key lookups using indexed syntax");  // OK
else
    NSLog(@"\nsod it");

if ([keysByName doesContain:@"fred"])
    NSLog(@"\n doesContain works literally");
else
    NSLog(@"\nsod it");  // this one fails because of id comparison used by doesContain

#3楼

更新的Objective-C和Clang版本具有现代语法:

if (myDictionary[myKey]) {

}

您不必检查与nil的相等性,因为只有非零的Objective-C对象可以存储在字典(或数组)中。 并且所有Objective-C对象都是真实的值。 甚至@0 @NO@0[NSNull null]评估为true。

编辑:斯威夫特现在是一个东西。

对于Swift,你会尝试类似下面的内容

if let value = myDictionary[myKey] {

}

如果myKey在dict中,则此语法仅执行if块,如果是,则将值存储在value变量中。 请注意,这适用于0等虚假值。


#4楼

使用Swift,它将是:

if myDic[KEY] != nil {
    // key exists
}

#5楼

如果密钥不存在, objectForKey将返回nil。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!