webentwicklung-frage-antwort-db.com.de

iOS: Warum kann ich nil nicht auf den NSDictionary-Wert setzen?

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"];
43
applefreak

Es möchte ein tatsächliches Objekt ... benutze NSNull

[NSNull null];
64
tybro0103

Sie können can mit 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 ist nil. In diesem Fall versucht die Methode stattdessen, den Schlüssel mit removeObjectForKey: 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.

49

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"];
4
SamSol

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.

1
Avi Levin

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.
0
Kunal Balani