nsdictionaryまたはnsmutadedictionaryにキーが含まれているかどうかを確認する方法は?

StackOverflow https://stackoverflow.com/questions/2784648

  •  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 キーの存在を確認するには、電話するとき objectForKeyNullable 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"
} 
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top