Как проверить, содержит ли ключ NSDictionary или NSMutableDictionary? - PullRequest
451 голосов
/ 07 мая 2010

Мне нужно проверить, есть ли у диктанта ключ или нет. Как?

Ответы [ 15 ]

757 голосов
/ 07 мая 2010

objectForKey вернет ноль, если ключ не существует.

162 голосов
/ 07 мая 2010
if ([[dictionary allKeys] containsObject:key]) {
    // contains key
}

или

if ([dictionary objectForKey:key]) {
    // contains object
}
97 голосов
/ 25 февраля 2014

Более поздние версии Objective-C и Clang имеют современный синтаксис для этого:

if (myDictionary[myKey]) {

}

Вам не нужно проверять равенство с nil, потому что только объекты Objective-C, отличные от nil, могут бытьхранится в словарях (или массивах).И все объекты Objective-C являются истинными значениями.Даже @NO, @0 и [NSNull null] оцениваются как истинные.

Редактировать: Swift теперь вещь.

Для Swift вы должны попробовать что-то вроде следующего:

if let value = myDictionary[myKey] {

}

Этот синтаксис будет выполнять блок if только в том случае, если myKey находится в dict, и если это так, то значение сохраняется в значениипеременная.Обратите внимание, что это работает даже для значений фальси, таких как 0.

22 голосов
/ 07 мая 2010
if ([mydict objectForKey:@"mykey"]) {
    // key exists.
}
else
{
    // ...
}
9 голосов
/ 24 июля 2015

При использовании словарей JSON:

#define isNull(value) value == nil || [value isKindOfClass:[NSNull class]]

if( isNull( dict[@"my_key"] ) )
{
    // do stuff
}
8 голосов
/ 07 февраля 2012

Мне нравится ответ Фернандеса, даже если вы дважды спрашиваете об объекте.

Это также должно делать (более или менее то же самое, что и у Мартина А).

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

5 голосов
/ 11 ноября 2013

Одна очень неприятная ошибка, которая просто потратила немного моего времени на отладку - при автоматическом заполнении вы можете попытаться использовать doesContain, который, кажется, работает.

Кроме того, doesContain использует сравнение идентификаторов вместо сравнения хешей, используемого 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
5 голосов
/ 03 октября 2013

Да. Ошибки такого рода очень распространены и приводят к сбою приложения. Поэтому я использую для добавления 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"];
4 голосов
/ 28 октября 2014

Используя Swift, это будет:

if myDic[KEY] != nil {
    // key exists
}
3 голосов
/ 11 января 2016

Для проверки наличия ключа в NSDictionary:

if([dictionary objectForKey:@"Replace your key here"] != nil)
    NSLog(@"Key Exists");
else
    NSLog(@"Key not Exists");
...