Мне нужно проверить, есть ли у ключа ключ или нет. Как?
Как проверить, содержит ли NSDictionary или NSMutableDictionary ключ?
Ответ 1
objectForKey
вернет нуль, если ключ не существует.
Ответ 2
if ([[dictionary allKeys] containsObject:key]) {
// contains key
}
или
if ([dictionary objectForKey:key]) {
// contains object
}
Ответ 3
Более свежие версии Objective-C и Clang имеют современный синтаксис для этого:
if (myDictionary[myKey]) {
}
Вам не нужно проверять равенство с nil, потому что в словарях (или массивах) могут храниться только объекты, отличные от nil Objective-C. И все объекты Objective-C являются правными значениями. Даже @NO
, @0
и [NSNull null]
оцениваются как истинные.
Изменить: Swift теперь вещь.
Для Swift вы попытаетесь сделать что-то вроде следующего
if let value = myDictionary[myKey] {
}
Этот синтаксис будет выполнять только if-блок, если myKey находится в dict, и если это тогда, то значение сохраняется в переменной значения. Обратите внимание, что это работает для даже ложных значений, таких как 0.
Ответ 4
if ([mydict objectForKey:@"mykey"]) {
// key exists.
}
else
{
// ...
}
Ответ 5
Мне нравится ответ Фернандеса, хотя вы дважды спрашиваете obj.
Это также должно делать (более или менее то же, что и Martin 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
Ответ 6
При использовании словарей JSON:
#define isNull(value) value == nil || [value isKindOfClass:[NSNull class]]
if( isNull( dict[@"my_key"] ) )
{
// do stuff
}
Ответ 7
Один очень неприятный gotcha, который просто потратил немного времени на отладку - вы можете попросить автозаполнение попробовать использовать 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
Ответ 8
С помощью Swift это будет:
if myDic[KEY] != nil {
// key exists
}
Ответ 9
Поскольку nil не может быть сохранен в структурах данных Foundation, NSNull
иногда должен представлять nil
. Поскольку NSNull
- это одноэлементный объект, вы можете проверить, есть ли NSNull
значение, хранящееся в словаре, с помощью сравнения прямых указателей:
if ((NSNull *)[user objectForKey:@"myKey"] == [NSNull null]) { }
Ответ 10
Да. Такие ошибки очень распространены и приводят к сбою приложения. Поэтому я использую для добавления 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"];
Ответ 11
Для проверки наличия ключа в NSDictionary:
if([dictionary objectForKey:@"Replace your key here"] != nil)
NSLog(@"Key Exists");
else
NSLog(@"Key not Exists");
Ответ 12
Я предлагаю вам сохранить результат поиска в переменной temp, протестировать, если переменная temp равна нулю, а затем использовать ее. Таким образом, вы не смотрите один и тот же объект дважды:
id obj = [dict objectForKey:@"blah"];
if (obj) {
// use obj
} else {
// Do something else
}
Ответ 13
if ([MyDictionary objectForKey:MyKey]) {
// "Key Exist"
}
Ответ 14
Swift 3.0
if (dictionary.allKeys as NSArray).contains(key) {
// contains key
}