Eine der häufigsten Anforderungen an eine App ist das Speichern von individuellen Nutzereinstellungen. Egal, ob es hierbei um kosmetische Anpassungen wie ein individuelles App-Icon oder unterschiedliche Themes innerhalb einer App oder interne Daten wie Kontaktinformationen geht: Irgendwie müssen diese Informationen gespeichert und zur späteren Verwendung ausgelesen werden.
Für Apple Developer bietet sich für derartige Szenarien seit jeher die Klasse UserDefaults
(ehemals NSUserDefaults
, unter Objective-C trägt sie noch immer diesen Namen) an. Sie fungiert als Interface zu einer App-internen Datenbank, in der alle Nutzereinstellungen gespeichert werden. Diese Einstellungen werden hierbei in Form von Key-Value-Paaren abgebildet. UserDefaults
bietet passende Methoden, um Daten in diese Datenbank zu schreiben und aus ihr auszulesen. Die Klasse ist hierbei als Singleton konzipiert, auf das über die Type Property standard
zugegriffen werden kann.
Einstellungen speichern
Die Klasse UserDefaults
bringt verschiedene Methoden mit, um Einstellungen zu speichern. Diese Methoden sind immer gleich aufgebaut und erwarten den zu speichernden Wert und einen zugehörigen Schlüssel, über den die entsprechende Einstellung auch ausgelesen werden kann. All diese Methoden tragen den Namen set(_:forKey:)
und erwarten unterschiedliche Parameter für den zu speichernden Wert. Eine Methode nimmt einen Float
-Parameter entgegen, eine andere einen Int
und wieder eine andere einen Double
. Welche Methoden es genau gibt, verrät die Dokumentation. Da es auch eine Variante der Methode mit einem Parameter vom Typ Any?
gibt, könnt ihr aber letztlich jede Art von Information über UserDefaults
speichern.
Die Schlüssel könnt ihr selbst frei festlegen. Es handelt sich bei ihnen um Strings, die ihr idealerweise in globalen Konstanten speichert und aufruft, um mögliche Tippfehler beim Zugriff auf eine Einstellung zu verhindern.
Ein simples Beispiel, wie die Speicherung einer Einstellung mittels UserDefaults
erfolgen kann, zeigt das folgende Listing. Darin wird zunächst ein Schlüssel in der Konstanten firstNameKey
definiert. Der dient dazu, den Vornamen eines Nutzers persistent in einer App zu speichern. Anschließend wird auf das Singleton von UserDefaults
über die standard
-Type Property zugegriffen und auf ihr die set(_:forKey:)
-Methode mit den gewünschten Informationen aufgerufen.
let firstNameKey = "FirstName"
let userDefaults = UserDefaults.standard
userDefaults.set("Thomas", forKey: firstNameKey)
Einstellungen auslesen
Um auf gespeicherte Informationen innerhalb einer App zuzugreifen, geht ihr analog zur Speicherung vor. Statt der verschiedenen Setter-Methoden stellt euch die Klasse UserDefaults
für diesen Zweck mehrere Getter-Methoden zur Verfügung, die als Parameter den Schlüssel der Einstellung erwarten, deren Wert ihr erhalten möchtet. Diese Getter-Methoden besitzen alle unterschiedliche Namen, abhängig davon, welchen Wert ihr auslesen möchtet. string(forKey:)
beispielsweise liefert euch einen String zurück, bool(forKey:)
ein Boolean oder integer(forKey:)
einen Integer. Als eierlegende Wollmilchsau lässt sich die Methode object(forKey:)
nutzen, die euch eine Instanz vom Typ Any?
zurückliefert. Das Ergebnis müsst ihr entsprechend noch in den konkreten Typ, den ihr erwartet, casten.
Das folgende Listing zeigt, wie sich der zuvor gespeicherte String mithilfe der Getter-Methode string(forKey:)
wieder auslesen und einer Konstanten zuweisen lässt.
let firstName = userDefaults.string(forKey: firstNameKey)
Fazit
Die Klasse UserDefaults
lässt sich simpel bedienen und erlaubt die unkomplizierte Speicherung von Nutzereinstellungen. Mithilfe einer Setter-Methode wird eine Einstellung gespeichert und mittels passender Getter-Methoden wieder ausgelesen; fertig! Nur große Datenmengen haben bei der Arbeit mit UserDefaults
nichts zu suchen. Die sollten innerhalb einer zusätzlichen Datenbank oder direkt lokal als Dateien im Dateiverzeichnis einer App gespeichert werden.
Euer Thomas
Schreibe einen Kommentar