2016-04-10 9 views
1

Ich brauche ein Wörterbuch zu speichern, dass die eine Null als WertShop-Wörterbuch mit optionalen Werten [Zeichenfolge: ANYOBJECT] in NSUserDefaults

Beispiel

var someOptionalVar: String? = nil 

var dict: [String: AnyObject?] = [ 
    "someOptionalVar": self.someOptionalVar 
] 

defaults.setObject(dict, forKey: self.nsUserDefaultsKey) 

Aber es gibt mir diese Fehler enthalten kann

Kann Wert vom Typ '[String: AnyObject?]' Nicht in erwarteten Wert konvertiert werden Argumenttyp 'AnyObject?'

Ich weiß, ich konnte die Null-Variablen lassen und dann, wenn ich das Wörterbuch von NSUserDefaults Parsen würde ich Variablen gesetzt (entsprechend den fehlenden Eigenschaften) auf Null, aber das ist nicht, was ich tun möchte.

Wie kann ich also NIL-Werte in NSUserDefaults speichern?

+0

Das sieht ähnlich aus: http://stackoverflow.com/a/34053503/3402095 – Whirlwind

+0

war ich nur um diesen Link zu posten. Es sieht so aus, als würde es mit Optionals nicht funktionieren, da sie nicht durch Foundation-Typen dargestellt werden können. – WERUreo

+0

@Whirlwind Ähnlich, aber nicht dasselbe, das war ein 'Array' von' Optional' und dies ist ein 'Dictionary' von' Optional'. Wenn Sie in den Standardeinstellungen explizit notieren möchten, dass ein Wert für einen Schlüssel "nil" ist, ist "NSNull" wahrscheinlich am besten. Der Schlüssel kann auch weggelassen werden, und der Wert wird als "Null" angenommen, wenn das Schlüssel/Wert-Paar nicht im "Wörterbuch" enthalten ist. – ColGraff

Antwort

6

Verwendung NSNull() anstelle von Null, und das Wörterbuch erklären nur nicht-optionals enthalten:

var someOptionalVar: String? = nil 

var dict: [String: AnyObject] = [ 
    "someOptionalVar": self.someOptionalVar ?? NSNull() 
] 

defaults.setObject(dict, forKey: self.nsUserDefaultsKey) 
+4

Sie können '(self.someOptionalVar! = Nil) ersetzen? self.someOptionalVar: NSNull() 'mit dem [nil coalescing operator] (https://developer.apple.com/library/ios/documentation/Swift/Konzept/Swift_Programming_Language/BasicOperators.html # // Apple_ref/doc/uid/TP40014097-CH6-ID72) '??' 'wie folgt:' self.someOptionalVar ?? NSNull() ' – ColGraff

+1

Ihre Antwort ist nicht ganz die gleiche wie die Frage. Der OP-Code erstellt ein Wörterbuch von [String: AnyObject?], Aber Sie haben ein Wörterbuch von [String: AnyObject]. Ich kenne die Antwort selbst nicht, aber es scheint mit dem optionalen AnyObject im Wörterbuch zu tun zu haben. Ich habe den OP-Code umgeschrieben, aber das optionale AnyObject weggelassen und es hat gut funktioniert. – WERUreo

+1

@WERUreo Ein optionales Element in Swift wird in Foundation-Klassen in einen Nullzeiger umgewandelt. Foundation-Auflistungsklassen dürfen nicht nil enthalten, so dass stattdessen "NSNull" verwendet wird (http://www.cocoaithllove.com/2008/06/doing-things-in-cocoa-with.html). Daher sollte alles, was Sie in den Standardeinstellungen speichern möchten, von 'Optional' in einen konkreten Wert oder' NSNull' konvertiert werden. Alternativ können Sie das 'Dictionary' konvertieren, um nicht-optionswerte Werte zu verwenden und die Schlüssel mit' nil' Werten zu entfernen. – ColGraff

Verwandte Themen