NSDictionary - Es muss überprüft werden, ob das Wörterbuch ein Schlüssel-Wert-Paar enthält oder nicht

96

Ich muss nur Folgendes fragen. Angenommen, ich habe ein Wörterbuch.

NSMutableDictionary *xyz=[[NSMutableDictionary alloc] init];
[xyz setValue:@"sagar" forKey:@"s"];
[xyz setValue:@"amit" forKey:@"a"];
[xyz setValue:@"nirav" forKey:@"n"];
[xyz setValue:@"abhishek" forKey:@"a"];
[xyz setValue:@"xrox" forKey:@"x"];

Jetzt muss ich Folgendes überprüfen

[xyz enthält Schlüssel "b" Wert? Paar oder nicht?

Frage ist wie?

Die andere Frage ist, wie man nur das gesamte Schlüssel-Wert-Paar zählt.

Sagen Sie zum Beispiel NSInteger mCount=[xyz keyCounts];

Sagar R. Kothari
quelle

Antworten:

193

Fragen Sie einfach nach dem objectForKey:@"b". Wenn es zurückkehrt nil, wird an diesem Schlüssel kein Objekt festgelegt.

if ([xyz objectForKey:@"b"]) {
    NSLog(@"There's an object set for key @\"b\"!");
} else {
    NSLog(@"No object set for key @\"b\"");
}

Bearbeiten : Die bearbeitete zweite Frage ist einfach NSUInteger mCount = [xyz count];. Beide Antworten sind gut dokumentiert und leicht in der NSDictionary- Klassenreferenz ( [1] [2] ) zu finden.

Matt B.
quelle
+1 In der Dokumentation heißt es in der Tat: developer.apple.com/mac/library/documentation/Cocoa/Reference/…
Dave DeLong
6
Was ist, wenn der Schlüssel im Wörterbuch vorhanden ist und sein Wert 0 ist? Würden wir nicht fälschlicherweise denken, dass der Schlüssel überhaupt nicht im Wörterbuch vorhanden ist?
jbx72487
13
@ jbx72487 Wörterbücher müssen Objekte enthalten; objectForKey:Gibt ideinen Zeiger auf ein Objective-C-Objekt zurück. Wenn Sie Nummern speichern, müssen diese in eine NS-Nummer "eingepackt" werden . Selbst wenn die NSNumber Null oder falsch ist, ist sie immer noch ein gültiger Zeiger und der obige Code erkennt die Existenz genau.
Matt B.
Wenn ich nicht mit mir zusammenarbeite, wird Folgendes zurückgegeben: Beenden der App aufgrund einer nicht erfassten Ausnahme 'NSInvalidArgumentException', Grund: '- [__ NSSingleObjectArrayI objectForKey:]: Nicht erkannter Selektor an Instanz 0x60000133a1c0 gesendet'
Amr Angry
2

Mit der Literal-Syntax können Sie Folgendes überprüfen

static const NSString* kKeyToCheck = @"yourKey"
if (xyz[kKeyToCheck])
  NSLog(@"Key: %@, has Value: %@", kKeyToCheck, xyz[kKeyToCheck]);
else
 NSLog(@"Key pair do not exits for key: %@", kKeyToCheck); 
Hariszaman
quelle