Ich muss überprüfen, ob ein Diktat einen Schlüssel hat oder nicht. Wie?
objective-c
foundation
dontWatchMyProfile
quelle
quelle
NSDictionary
beliebige Taste (unspezifisch) enthält , sollten Sie verwenden ,[dictionary allKeys].count == 0
wenn diecount
ist0
es keine Tasten in der sindNSDictionary
.Antworten:
objectForKey
gibt nil zurück, wenn kein Schlüssel existiert.quelle
[NSNull null]
stattdessen verwenden.oder
quelle
Neuere Versionen von Objective-C und Clang haben hierfür eine moderne Syntax:
Sie müssen nicht auf Gleichheit mit nil prüfen, da nur Objective-C-Objekte ungleich nil in Wörterbüchern (oder Arrays) gespeichert werden können. Und alle Objective-C-Objekte sind wahrheitsgemäße Werte. Auch
@NO
,@0
und[NSNull null]
bewertet , wie wahr.Edit: Swift ist jetzt eine Sache.
Für Swift würden Sie so etwas wie das Folgende versuchen
Diese Syntax führt den if-Block nur aus, wenn sich myKey im Diktat befindet und wenn dies der Fall ist, wird der Wert in der Wertvariablen gespeichert. Beachten Sie, dass dies auch für Falsey-Werte wie 0 funktioniert.
quelle
quelle
Bei Verwendung von JSON-Wörterbüchern:
quelle
Ich mag Fernandes 'Antwort, obwohl Sie zweimal nach dem Objekt fragen.
Dies sollte auch funktionieren (mehr oder weniger dasselbe wie Martins A).
Martins und diese Antwort funktionieren beide auf dem iPad2 iOS 5.0.1 9A405
quelle
Ein sehr böses Problem, das nur ein wenig Zeit mit dem Debuggen verschwendet hat - Sie werden möglicherweise durch die automatische Vervollständigung aufgefordert, zu versuchen,
doesContain
das zu verwenden, was zu funktionieren scheint.Ausgenommen,
doesContain
verwendet einen ID-Vergleich anstelle des von verwendeten Hash-Vergleichs.objectForKey
Wenn Sie also ein Wörterbuch mit Zeichenfolgenschlüsseln haben, wird NO an a zurückgegebendoesContain
.quelle
Mit Swift wäre es:
quelle
Ja. Diese Art von Fehlern ist sehr häufig und führt zum Absturz der App. Also füge ich NSDictionary in jedem Projekt wie folgt hinzu:
//.h Dateicode:
//.m Dateicode ist wie folgt
Im Code können Sie wie folgt verwenden:
quelle
So überprüfen Sie das Vorhandensein eines Schlüssels in NSDictionary:
quelle
Da nil nicht in Foundation-Datenstrukturen gespeichert werden kann, muss
NSNull
manchmal a dargestellt werdennil
. DaNSNull
es sich um ein Singleton-Objekt handelt, können SieNSNull
mithilfe des direkten Zeigervergleichs überprüfen, ob der Wert im Wörterbuch gespeichert ist:quelle
NSNull
Instanz als Wert für den Schlüssel im Wörterbuch gespeichert wurde@"myKey"
. Das ist eine ganz andere Sache als der Schlüssel, der@"myKey"
nicht im Wörterbuch enthalten ist - tatsächlich schließen sich die beiden gegenseitig aus.Lösung für schnelle 4.2
Wenn Sie also nur die Frage beantworten möchten, ob das Wörterbuch den Schlüssel enthält, fragen Sie:
Wenn Sie den Wert möchten und wissen, dass das Wörterbuch den Schlüssel enthält, sagen Sie:
Wenn Sie jedoch wie gewöhnlich nicht wissen, dass der Schlüssel enthalten ist - Sie möchten ihn abrufen und verwenden, aber nur, wenn er vorhanden ist -, verwenden Sie Folgendes
if let
:quelle
Ich würde vorschlagen, dass Sie das Ergebnis der Suche in einer temporären Variablen speichern, testen, ob die temporäre Variable Null ist, und sie dann verwenden. Auf diese Weise suchen Sie nicht zweimal dasselbe Objekt nach:
quelle
Wie Adirael vorgeschlagen hat
objectForKey
, die Schlüsselexistenz zu überprüfen, aber wenn SieobjectForKey
ein nullbares Wörterbuch aufrufen , stürzt die App ab, sodass ich dies auf folgende Weise behoben habe.}}
quelle
quelle