2011-01-08 3 views
69

, как я могу проверить, существует ли это ?:Проверить ключ существует в NSDictionary

[[dataArray objectAtIndex:indexPathSet.row] valueForKey:@"SetEntries"] 

Я хочу знать, существует ли этот ключ или нет. Как я могу это сделать?

Большое спасибо :)

EDIT: DataArray имеет объекты в нем. И эти объекты - NSDictionaries.

+0

Любая причина, по которой вы используете '-valueForKey:' вместо '-objectForKey:'? Первый используется в кодировании с ключом и немного медленнее последнего. –

ответ

149

Я полагаю, что [dataArray objectAtIndex:indexPathSet.row] возвращается в NSDictionary, в этом случае вы можете просто проверить результат valueForKey против ноля.

Например:

if([[dataArray objectAtIndex:indexPathSet.row] valueForKey:@"SetEntries"] != nil) { 
    // The key existed... 

} 
else { 
    // No joy... 

} 
34

Проверьте это ноль:

if ([[dataArray objectAtIndex:indexPathSet.row] valueForKey:@"SetEntries"] != nil) { 
    // SetEntries exists in this dict 
} else { 
    // No SetEntries in this dict 
} 
46

Так что я знаю, что вы уже выбрали ответ, но я нашел, что это будет весьма полезно в качестве категории на NSDictionary. Вы начинаете получать эффективность в этот момент со всеми этими различными ответами. Мех ... 6 1 ...

- (BOOL)containsKey: (NSString *)key { 
    BOOL retVal = 0; 
    NSArray *allKeys = [self allKeys]; 
    retVal = [allKeys containsObject:key]; 
    return retVal; 
} 
+0

Я также написал тот же метод в своей категории, но у меня случился странный сбой, когда я использовал UIImageWriteToSavedPhotosAlbum(). после сужения, я меняю имя метода из containsKey => hasKey, и исчезновение сбоя – kaala

+0

Это намного лучше, чем принятый ответ. Я хочу выполнить поиск по ключу, а не если значение ключа равно нулю или нет. У вас может быть ключ в словаре, который указывает на значение nil. Но ключ существует. Принятый ответ не охватывает этот сценарий. Но это решение здесь. – Houman

+3

@Hooman: Не верно относительно ключа, имеющего значение nil: второй абзац документации NSDictionary (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSDictionary_Class/Reference /Reference.html) указывает, что «ни ключ, ни значение не могут быть равны нулю, если вам нужно представить нулевое значение в словаре, вы должны использовать NSNull». И этот, и принятый ответ работают для вашего сценария, то есть со словарем, где значение для некоторого ключа равно null (типа NSNull). –

0
if ((NSNull *)[[dataArray objectAtIndex:indexPathSet.row] valueForKey:@"SetEntries"] != nil) { 
    // SetEntries exists in this dict 
} else { 
    // No SetEntries in this dict 
} 

Это правильный ответ.

+0

Что отличает BOOL от NSNull * за? –

0

Попробуйте это:

if ([dict objectForKey:@"bla"]) { 
    // use obj 
} else { 
    // Do something else like create the object 
} 
+1

Это может быть технически корректное объяснение, но вы будете лучше обслуживать сообщество (и, вероятно, получить больше голосов), если вы предоставите более подробное обсуждение ваших рассуждений в теле вашего ответа. Почему целесообразно использовать 'objectForKey:' вместо другого метода? Почему вы явно не должны проверять ценность? По крайней мере, используя пример кода, приведенный в вопросе, упростит привязку вашего примера к исходному вопросу. – Palpatim

0

Это один делает то же самое, но с меньшим количеством кода:

if (dataArray[indexPathSet.row][@"SetEntries"] != nil) { /* the key exists */  } 
else             { /* the key doesn't exist */ } 
6

это также работает с использованием Objective-C литералов, используя следующий синтаксис:

NSDictionary *dict = @{ @"key1" : @"value1", @"key2" : @"value2" }; 
if (dict[@"key2"]) 
NSLog(@"Exists"); 
else 
NSLog(@"Does not exist"); 
+0

Для быстрой версии ниже кода работает. пусть заголовки: Словарь = HTTPResponse .allHeaderFields если (заголовки [ "ErrorCode"] = ноль!) { печать ("ключ ошибка существует") } –

0

Проверить словарь содержит любое значение. Я предпочитаю [dic allKeys] .count> 0 для проверки.

Смежные вопросы