Мені потрібно перевірити, чи є в дікті ключ чи ні. Як?
NSDictionary
містить будь - яких ключ (неспецифічний) дотримуєшся використовувати [dictionary allKeys].count == 0
Якщо count
це 0
немає ключів в NSDictionary
.
Мені потрібно перевірити, чи є в дікті ключ чи ні. Як?
NSDictionary
містить будь - яких ключ (неспецифічний) дотримуєшся використовувати [dictionary allKeys].count == 0
Якщо count
це 0
немає ключів в NSDictionary
.
Відповіді:
objectForKey
поверне нуль, якщо ключ не існує.
[NSNull null]
замість цього.
if ([[dictionary allKeys] containsObject:key]) {
// contains key
}
або
if ([dictionary objectForKey:key]) {
// contains object
}
Більш новітні версії Objective-C і Clang мають для цього сучасний синтаксис:
if (myDictionary[myKey]) {
}
Не потрібно перевіряти рівність з нулем, оскільки в словниках (або масивах) можуть зберігатися лише ненульові об'єкти Objective-C. І всі об'єкти Objective-C є трибунними значеннями. Навіть @NO
, @0
і [NSNull null]
оцініть як істинне.
Редагувати: Свіфт зараз річ.
Для Swift ви б спробували щось подібне
if let value = myDictionary[myKey] {
}
Цей синтаксис буде виконувати лише блок if, якщо myKey знаходиться у dict, і якщо він є, то значення зберігається у змінній значення. Зауважте, що це працює для рівних фальсийних значень, таких як 0.
if ([mydict objectForKey:@"mykey"]) {
// key exists.
}
else
{
// ...
}
Під час використання словників JSON:
#define isNull(value) value == nil || [value isKindOfClass:[NSNull class]]
if( isNull( dict[@"my_key"] ) )
{
// do stuff
}
Мені подобається відповідь Фернандеса, хоч ти два рази просиш об'єм.
Це також має робити (більш-менш те саме, що і А Мартіна).
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
Один дуже неприємний хитч, який просто витратив трохи мого часу налагодження - вам може бути запропоновано автоматичне завершення спробувати використовувати doesContain
який, здається, працює.
За винятком випадків, doesContain
використовує порівняння id замість хеш-порівняння, яке використовує objectForKey
так, якщо у вас є словник зі строковими клавішами, він поверне NO до a 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"];
Для перевірки наявності ключа в NSDictionary:
if([dictionary objectForKey:@"Replace your key here"] != nil)
NSLog(@"Key Exists");
else
NSLog(@"Key not Exists");
Оскільки нуль не може бути збережений у структурах даних Foundation NSNull
, іноді є символом a nil
. Оскільки NSNull
це однотонний об'єкт, ви можете перевірити, чи NSNull
є значення, яке зберігається у словнику, використовуючи порівняння прямого вказівника:
if ((NSNull *)[user objectForKey:@"myKey"] == [NSNull null]) { }
NSNull
екземпляр singleton був збережений у словнику як значення для ключа @"myKey"
. Це зовсім інша річ у тому, що ключ @"myKey"
не міститься у словнику - справді ці два є взаємовиключними.
Рішення для швидкого 4.2
Отже, якщо ви просто хочете відповісти на питання, чи містить словник ключ, запитайте:
let keyExists = dict[key] != nil
Якщо ви хочете, щоб значення і ви знаєте, що словник містить ключ, скажіть:
let val = dict[key]!
Але якщо, як це зазвичай буває, ви не знаєте, що він містить ключ - ви хочете взяти його і використовувати його, але тільки якщо він існує - тоді використовуйте щось на зразок if let
:
if let val = dict[key] {
// now val is not nil and the Optional has been unwrapped, so use it
}
Оскільки Адіраель запропонував 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;
}
if ([MyDictionary objectForKey:MyKey]) {
// "Key Exist"
}