Der Prüfschlüssel ist im NSDictionary vorhanden

76

Wie kann ich überprüfen, ob dies vorhanden ist?:

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

Ich möchte wissen, ob dieser Schlüssel existiert oder nicht. Wie kann ich das machen?

Vielen Dank :)

BEARBEITEN: dataArray enthält Objekte. Und diese Objekte sind NSDictionaries.

cocos2dbeginner
quelle
Gibt es einen Grund, warum Sie -valueForKey:anstelle von verwenden -objectForKey:? Ersteres wird bei der Schlüsselwertcodierung verwendet und ist etwas langsamer als letzteres.

Antworten:

158

Ich gehe davon aus, dass dies [dataArray objectAtIndex:indexPathSet.row]eine Rückgabe NSDictionaryist. In diesem Fall können Sie einfach das Ergebnis von valueForKeygegen prüfennil.

Zum Beispiel:

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

}
else {
    // No joy...

}
John Parker
quelle
Der Wert dieses Schlüssels kann auch Null sein, daher wird dieser Ansatz nicht vollständig testen, ob ein Schlüssel im Wörterbuch vorhanden ist oder nicht
Andrei A.
1
@ AndreiA.Sie können einem NSDictionary nicht null hinzufügen.
John Parker
46

Ich weiß also, dass Sie bereits eine Antwort ausgewählt haben, aber ich fand dies als Kategorie für ziemlich nützlich NSDictionary. Mit all diesen unterschiedlichen Antworten beginnen Sie an diesem Punkt mit der Effizienz. Meh ... 6 von 1 ...

- (BOOL)containsKey: (NSString *)key {
     BOOL retVal = 0;
     NSArray *allKeys = [self allKeys];
     retVal = [allKeys containsObject:key];
     return retVal;
}
Miles Alden
quelle
Ich habe die gleiche Methode auch in meiner Kategorie geschrieben, aber ich habe einen seltsamen Absturz, wenn ich UIImageWriteToSavedPhotosAlbum () verwende. Nach dem Eingrenzen ändere ich den Methodennamen von includesKey => hasKey und der Absturz ist verschwunden
kaala
Dies ist viel besser als die akzeptierte Antwort. Ich möchte nach einem Schlüssel suchen und nicht, ob der Wert des Schlüssels Null ist oder nicht. Sie könnten einen Schlüssel in einem Wörterbuch haben, der auf einen Nullwert verweist. Der Schlüssel existiert jedoch. Die akzeptierte Antwort deckt dieses Szenario nicht ab. Aber diese Lösung hier tut es.
Houman
3
@Hooman: Nicht zutreffend für einen Schlüssel mit dem Wert Null: Im zweiten Absatz der NSDictionary-Dokumentation ( developer.apple.com/library/mac/documentation/Cocoa/Reference/… ) heißt es: "Weder ein Schlüssel noch ein Wert können Null sein; wenn Sie einen Nullwert in einem Wörterbuch darstellen müssen, sollten Sie NSNull verwenden. " Sowohl diese als auch die akzeptierte Antwort funktionieren für Ihr Szenario, dh mit einem Wörterbuch, in dem ein Wert für einen Schlüssel null ist (vom Typ NSNull).
Jarno Lamberg
1
Oder: return [[self allKeys] enthältObject: key]? JA NEIN;
smileBot
3
gute Bezeichnung, @Jamo. Ich würde mich von dieser Antwort fernhalten. Ich vermute, dass unter dem Deckmantel sowohl der Aufruf von allKeys als auch der Aufruf von includesObject jeweils mindestens O (n) sind, während valueForKey wahrscheinlich viel geringer ist.
Orion Elenzil
34

Überprüfen Sie, ob es gleich Null ist:

if ([[dataArray objectAtIndex:indexPathSet.row] valueForKey:@"SetEntries"] != nil) {
    // SetEntries exists in this dict
} else {
    // No SetEntries in this dict
}
BoltClock
quelle
Der Wert dieses Schlüssels kann auch Null sein, daher wird dieser Ansatz nicht vollständig testen, ob ein Schlüssel im Wörterbuch vorhanden ist oder nicht
Andrei A.
@ AndreiA. Weder ein Schlüssel noch ein Wert dürfen sich nilin einem NSDictionary befinden. Um Null darzustellen, können Sie NSNull verwenden.
Aaron Ash
9

Dies funktioniert auch mit Objective-C-Literalen mit der folgenden Syntax:

NSDictionary *dict = @{ @"key1" : @"value1", @"key2" : @"value2" };
if (dict[@"key2"])
NSLog(@"Exists");
else
NSLog(@"Does not exist");
Yogesh Kumar
quelle
Für die schnelle Version unten funktioniert der Code. let headers: Dictionary = httpResponse .allHeaderFields if (headers ["errorcode"]! = nil) {print ("Fehlerschlüssel existiert")}
Narasimha Nallamsetty
0
if ((NSNull *)[[dataArray objectAtIndex:indexPathSet.row] valueForKey:@"SetEntries"] != nil) {
    // SetEntries exists in this dict
} else {
    // No SetEntries in this dict
}

Das ist die richtige Antwort.

Walter
quelle
1
Wofür ist die Besetzung von BOOL zu NSNull *?
NiñoScript
0

Versuche dies:

if ([dict objectForKey:@"bla"]) {
   // use obj
} else {
   // Do something else like create the object
}
Tee
quelle
1
Dies mag eine technisch korrekte Erklärung sein, aber Sie werden der Community besser dienen (und wahrscheinlich mehr positive Stimmen erhalten), wenn Sie Ihre Antwort im Hauptteil Ihrer Antwort ausführlicher diskutieren. Warum ist es angebracht, objectForKey:anstelle einer anderen Methode zu verwenden? Warum müssen Sie nicht explizit nach einem Wert suchen? Zumindest würde die Verwendung des in der Frage angegebenen Codebeispiels die Verknüpfung Ihres Beispiels mit der ursprünglichen Frage erleichtern.
Palpatim
0

Dieser macht das gleiche, aber mit weniger Code:

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

Das Wörterbuch überprüfen enthält einen beliebigen Wert. Ich bevorzuge [dic allKeys] .count> 0 zu überprüfen.

zedzhao
quelle
0

Verwenden Sie die (unsigned long)Option:

if ( (unsigned long)[[dataArray objectAtIndex:indexPathSet.row] valueForKey:@"SetEntries"] ) {
    // Key exist;
}else{
    // Key not exist;
};
TheAlphaGhost
quelle