nsdictionaryまたはnsmutadedictionaryにキーが含まれているかどうかを確認する方法は?
-
03-10-2019 - |
質問
dictがキーを持っているかどうかを確認する必要があります。どのように?
解決
objectForKey
キーが存在しない場合はゼルを返します。
他のヒント
if ([[dictionary allKeys] containsObject:key]) {
// contains key
}
また
if ([dictionary objectForKey:key]) {
// contains object
}
Objective-CとClangのより最近のバージョンには、このための最新の構文があります。
if (myDictionary[myKey]) {
}
NILではないObjective-Cオブジェクトのみが辞書(または配列)に保存できるため、NILとの平等を確認する必要はありません。そして、すべてのObjective-Cオブジェクトは真実の値です。平 @NO
, @0
, 、 と [NSNull null]
真実として評価します。
編集:Swiftは今ではあります。
Swiftの場合、次のようなものを試してみます
if let value = myDictionary[myKey] {
}
この構文は、mykeyがdictにある場合のifブロックのみを実行し、それが値が値変数に保存されます。これは、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
}
OBJを2回求めているにもかかわらず、フェルナンデスの答えが好きです。
これも実行する必要があります(Martin's 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
}
Martin'sとこの答えは両方ともiPad2 iOS 5.0.1 9A405で動作します
私の時間を少し無駄にしたばかりの非常に厄介なゴッチャがデバッグをしました - あなたは自分自身が使用してみてください。 doesContain
うまくいくようです。
それ外、 doesContain
が使用するハッシュ比較の代わりにID比較を使用します objectForKey
したがって、文字列キーを含む辞書がある場合、それは 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
Swiftを使用すると、次のようになります。
if myDic[KEY] != nil {
// key exists
}
はい。この種のエラーは非常に一般的であり、アプリのクラッシュにつながります。したがって、以下のように各プロジェクトに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");
NILは基礎データ構造に保存できないためです NSNull
時々表すことです nil
. 。なぜなら NSNull
あなたがチェックできるシングルトンオブジェクトです NSNull
直接的なポインター比較を使用して、辞書に保存されている値は次のとおりです。
if ((NSNull *)[user objectForKey:@"myKey"] == [NSNull null]) { }
Swift 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
}
ルックアップの結果を温度変数に保存し、温度変数がnilであるかどうかをテストしてから使用することをお勧めします。そうすれば、同じオブジェクトを2回見ていません:
id obj = [dict objectForKey:@"blah"];
if (obj) {
// use obj
} else {
// Do something else
}
アディラエルが示唆したように objectForKey
キーの存在を確認するには、電話するとき objectForKey
Nullable Dictionaryでは、アプリがクラッシュするため、次の方法からこれを修正しました。
- (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"
}