Как проверить, содержит ли 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
}