Dies mag eine sehr grundlegende Frage sein, aber ich habe mich gefragt, warum ich nil nicht als NSDictionary-Wert zuweisen kann. Ich habe folgende Aussage an vielen Stellen in meinem Code. Wenn [q objectForKey:@"text"]
ist null, dann stürzt die App ab.
NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithCapacity:2];
[dict setObject:[q objectForKey:@"text"] forKey:@"text"];
Ich muss überall nach dem Nullwert suchen, bevor ich ihn dem Wörterbuch zuordnete. Ist das der einzig richtige Weg? Vermisse ich etwas Offensichtliches?
if([q objectForKey:@"text"] != nil)
[dict setObject:[q objectForKey:@"text"] forKey:@"text"];
else
[dict setObject:@"" forKey:@"text"];
Es möchte ein tatsächliches Objekt ... benutze NSNull
[NSNull null];
setValue:forKey
Einen Nullwert setzen, aber der Schlüssel wird entfernt.Wenn Sie in der Lage sein möchten, einen Schlüssel auf nil
zu setzen, können Sie setValue:forKey:
verwenden, um den Schlüssel zu entfernen, wenn Sie ihn auf nil
setzen ( Zitat aus der Dokumentation unten). Beachten Sie den Wert anstelle von Object.
setValue:forKey:
Fügt dem Wörterbuch ein bestimmtes Schlüssel-Wert-Paar hinzu.
Diskussion...
Diese Methode fügt dem Wörterbuch mit
setObject:forKey:
Wert und Schlüssel hinzu, es sei denn, der Wert istnil
. In diesem Fall versucht die Methode stattdessen, den Schlüssel mitremoveObjectForKey:
Zu entfernen.
Wenn Sie später versuchen, das Objekt mit objectForKey:
für den Schlüssel abzurufen, den Sie durch Setzen auf nil
entfernt haben, erhalten Sie nil
zurück (Anführungszeichen) aus der Dokumentation unten).
Rückgabewert:Der mit aKey verknüpfte Wert oder nil, wenn kein Wert mit aKey verknüpft ist.
Hinweis: Der Schlüssel ist im Wörterbuch nicht vorhanden und kann daher nicht mit allKeys
abgerufen werden. oder aufgezählt werden.
Sie können nil object folgendermaßen einstellen:
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
dictionary[@“key”] = nil;
Hast du es bemerkt?
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
/* this statement is safe to execute */
dictionary[@“key”] = nil;
/* but this statement will crash application */
[dictionary setObject:nil forKey:@"key"];
Bei Verwendung dieser Methode:
func setObject(_ anObject: Any, forKey aKey: NSCopying)
Parameter ( laut Apple doc's ):
anObject:
Löst eine invalidArgumentException aus, wenn anObject den Wert null hat. Wenn Sie einen Nullwert im Wörterbuch darstellen müssen, verwenden Sie NSNull.
aKey
Löst eine invalidArgumentException aus, wenn aKey null ist.
Mein Freund mit Null als Marker ist ein Zeichen für schlechte Programmierung. nil ist für einen anderen Zweck reserviert.
if ([q objectForKey: @ "text"]! = nil) [dikt setObject: [q objectForKey: @ "text"] forKey: @ "text"]; else [dict removeObjectforKey: @ "text"]; // dies wird nichts bewirken, wenn der Schlüssel nicht existiert.
// Standardmäßig ist der Wert für alle Schlüssel Null und Sie versuchen, dieses Verhalten zu überschreiben. Wenn du gegen die Sprachregeln verstößt, bekommst du immer Probleme.
zum prüfen einfach benutzen
if ([dict objectforKey: @ "text"]! = nil) {} // Dies funktioniert, da der Standardwert nil selbst ist.