我需要检查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。
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3161313