Ich arbeite an einer kleinen iPhone-App und verwende sie NSUserDefaults
als Datenpersistenz. Es muss nur ein paar Dinge im Auge behalten, wie zum Beispiel einige Namen und einige Zahlen, also denke ich, ich könnte es genauso gut einfach halten.
Ich habe diese Seite als Referenz gefunden, aber ich glaube nicht, dass sie meine Frage beantworten kann. Grundsätzlich möchte ich überprüfen können, ob ein Wert (oder ein Schlüssel) bereits in der vorhanden ist, NSUserDefaults
und dann etwas entsprechend tun.
Einige Beispiele: Die App wird gestartet. Wenn sie zum ersten Mal gestartet wird, wird eine Warnung mit der Aufschrift "Willkommen" ausgegeben. Um festzustellen, ob dies das erste Mal ist, dass es geöffnet wird, liest es das UserDefaults
und prüft.
Beispiel 2: Es heißt "Hallo [Name]", wobei Name etwas ist, das Sie eingegeben haben. Wenn Sie die App geöffnet haben und keinen Namen haben, sollte dort "Hallo Welt" stehen. Ich muss überprüfen, ob Sie bereits einen Namen eingegeben haben, und entsprechend handeln. Der Name würde in gespeichert NSUserDefaults
.
Hilfe hier? Ich würde es wirklich schätzen!
quelle
– dictionaryRepresentation
den Schlüssel verwenden und nach ihm suchen.Wie oben erwähnt, funktioniert es nicht für primitive Typen, bei denen 0 / NO ein gültiger Wert sein könnte. Ich benutze diesen Code.
quelle
BOOL
. ImNO
Gegensatz dazu wird genau unterschieden und nicht eingestelltobjectForKey:
.objectForKey:
wirdnil
unabhängig von der Absicht des Programmierers, einenBool
oder einen anderen Datentyp zu speichern, zurückgegeben . Wenn ein Grundelement vorhanden ist, wirdobjectForKey:
es nicht zurückgegeben,nil
selbst wenn der Schlüssel einem Grundelement zugeordnet ist.Die
objectForKey:
Methode wird zurückgegeben,nil
wenn der Wert nicht vorhanden ist. Hier ist ein einfacher IF / THEN-Test, der Ihnen sagt, ob der Wert Null ist:quelle
" objectForKey gibt nil zurück, wenn es nicht existiert. " Es gibt auch nil zurück, wenn es existiert und es ist entweder eine Ganzzahl oder ein Boolescher Wert mit dem Wert Null (dh FALSE oder NO für den Booleschen Wert).
Ich habe dies im Simulator für 5.1 und 6.1 getestet. Dies bedeutet, dass Sie nicht wirklich testen können, ob Ganzzahlen oder Boolesche Werte festgelegt wurden, indem Sie nach "dem Objekt" fragen. Sie können damit für ganze Zahlen durchkommen, wenn es Ihnen nichts ausmacht, "nicht gesetzt" so zu behandeln, als wäre es "auf Null gesetzt".
Die Personen, die dies bereits getestet haben, scheinen durch den falsch-negativen Aspekt getäuscht worden zu sein, dh sie testen dies, indem sie prüfen, ob objectForKey null zurückgibt, wenn Sie wissen, dass der Schlüssel nicht gesetzt wurde, aber nicht bemerken, dass es auch null zurückgibt, wenn der Schlüssel vorhanden ist gesetzt, wurde aber auf NEIN gesetzt.
Für mein eigenes Problem, das mich hierher geschickt hat, habe ich gerade die Semantik meines Booleschen Werts so geändert, dass meine gewünschte Standardeinstellung mit dem auf NO gesetzten Wert übereinstimmt. Wenn dies keine Option ist, müssen Sie sie als etwas anderes als einen Booleschen Wert speichern und sicherstellen, dass Sie den Unterschied zwischen JA, NEIN und "Nicht festgelegt" erkennen können.
quelle
@0
statt0
,@NO
stattNO
oder einfach@(variable)
. Lesen Sie hier darüber.Swift 3/4:
Hier ist eine einfache Erweiterung für Int / Double / Float / Bool-Schlüsselwerttypen, die das optionale Rückgabeverhalten der anderen Typen nachahmt, auf die über UserDefaults zugegriffen wird.
( Bearbeiten 30. August 2018: Aktualisiert mit effizienterer Syntax aus Leos Vorschlag.)
Sie sind jetzt konsistenter als die anderen integrierten get-Methoden (Zeichenfolge, Daten usw.). Verwenden Sie einfach die get-Methoden anstelle der alten.
quelle
return self.object(forKey: key) as? Int
, Wert nur einmal zu suchen.Ich habe das gerade durchgearbeitet, und all Ihre Antworten haben mir geholfen, eine gute Lösung für mich zu finden. Ich habe mich geweigert, den von vorgeschlagenen Weg zu gehen, nur weil ich es schwer fand, ihn zu lesen und zu verstehen.
Folgendes habe ich getan. Ich hatte ein BOOL in einer Variablen namens "_talkative" herumgetragen.
Wenn ich mein Standardobjekt (NSUserDefaults) festlege, lege ich es als Objekt fest, da ich dann testen kann, ob es null ist:
Als ich dann nachschaute, ob es existiert, benutzte ich:
Dann habe ich das Objekt als BOOL verwendet:
Dies scheint in meinem Fall zu funktionieren. Es machte für mich nur mehr visuellen Sinn.
quelle
Probieren Sie diese kleine Fladenbrot:
Behandle alles als Objekt. Scheint für mich zu arbeiten.
quelle
Schnelle Version zu bekommen
Bool?
quelle
boolForKey
?NSUserDefaults.standardUserDefaults().boolForKey(DefaultsIsGiver)
boolForKey
wird zurückkehrenBool
und nichtBool?
, also wenn der Schlüssel nicht da ist, werden Sie bekommenfalse
und nichtnil
Erweitern Sie
UserDefaults
einmal nicht copy-paste diese Lösung:quelle
In Swift3 habe ich auf diese Weise verwendet
Die Antwort ist großartig, wenn Sie das mehrmals verwenden möchten.
Ich hoffe, es hilft :)
quelle
Swift 3.0
quelle