我需要检查字典是否有键。怎么样?
NSDictionary
包含任何键(非特定键),则应使用[dictionary allKeys].count == 0
如果,count
则0
中没有键NSDictionary
。
我需要检查字典是否有键。怎么样?
NSDictionary
包含任何键(非特定键),则应使用[dictionary allKeys].count == 0
如果,count
则0
中没有键NSDictionary
。
Answers:
objectForKey
如果键不存在,将返回nil。
[NSNull null]
。
if ([[dictionary allKeys] containsObject:key]) {
// contains key
}
要么
if ([dictionary objectForKey:key]) {
// contains object
}
较新版本的Objective-C和Clang具有现代语法:
if (myDictionary[myKey]) {
}
您不必检查是否与nil相等,因为只有非nil的Objective-C对象可以存储在字典(或数组)中。而且所有Objective-C对象都是真实值。甚至@NO
,,@0
并且[NSNull null]
评估为true。
编辑:Swift现在是一回事。
对于Swift,您可以尝试以下操作
if let value = myDictionary[myKey] {
}
如果myKey在dict中,如果myKey存放在value变量中,则此语法仅执行if块。请注意,这适用于虚假的值,例如0。
一个非常讨厌的陷阱只是浪费了我一些时间进行调试-您可能会发现自己被自动完成提示,尝试使用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
是。这种错误非常常见,并会导致应用崩溃。所以我经常在每个项目中添加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"];
因为nil无法存储在Foundation中,所以数据结构NSNull
有时代表nil
。因为NSNull
是单例对象,所以您可以NSNull
使用直接指针比较来检查是否存储在字典中的值:
if ((NSNull *)[user objectForKey:@"myKey"] == [NSNull null]) { }
NSNull
实例已作为key的值存储在字典中,则此检查将返回true @"myKey"
。这@"myKey"
与字典中没有的键是完全不同的-确实两者是互斥的。
正如Adirael建议objectForKey
检查键是否存在,但是当您objectForKey
在可为空的字典中调用时,应用程序崩溃了,因此我通过以下方式修复了此问题。
- (instancetype)initWithDictionary:(NSDictionary*)dictionary {
id object = dictionary;
if (dictionary && (object != [NSNull null])) {
self.name = [dictionary objectForKey:@"name"];
self.age = [dictionary objectForKey:@"age"];
}
return self;
}