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.


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...

}

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;
}

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
}

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");

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.


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
}

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 */ }

0

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


0

Verwenden Sie die (unsigned long)Option:

if ( (unsigned long)[[dataArray objectAtIndex:indexPathSet.row] valueForKey:@"SetEntries"] ) {
    // Key exist;
}else{
    // Key not exist;
};
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.