Swift 5+
Nessuna delle risposte copre in dettaglio le funzionalità di archiviazione locale predefinite. Può fare molto più che semplici stringhe.
Sono disponibili le seguenti opzioni direttamente dalla documentazione di Apple per "ottenere" i dati dalle impostazioni predefinite.
func object(forKey: String) -> Any?
//Returns the object associated with the specified key.
func url(forKey: String) -> URL?
//Returns the URL associated with the specified key.
func array(forKey: String) -> [Any]?
//Returns the array associated with the specified key.
func dictionary(forKey: String) -> [String : Any]?
//Returns the dictionary object associated with the specified key.
func string(forKey: String) -> String?
//Returns the string associated with the specified key.
func stringArray(forKey: String) -> [String]?
//Returns the array of strings associated with the specified key.
func data(forKey: String) -> Data?
//Returns the data object associated with the specified key.
func bool(forKey: String) -> Bool
//Returns the Boolean value associated with the specified key.
func integer(forKey: String) -> Int
//Returns the integer value associated with the specified key.
func float(forKey: String) -> Float
//Returns the float value associated with the specified key.
func double(forKey: String) -> Double
//Returns the double value associated with the specified key.
func dictionaryRepresentation() -> [String : Any]
//Returns a dictionary that contains a union of all key-value pairs in the domains in the search list.
Ecco le opzioni per 'impostazione'
func set(Any?, forKey: String)
//Sets the value of the specified default key.
func set(Float, forKey: String)
//Sets the value of the specified default key to the specified float value.
func set(Double, forKey: String)
//Sets the value of the specified default key to the double value.
func set(Int, forKey: String)
//Sets the value of the specified default key to the specified integer value.
func set(Bool, forKey: String)
//Sets the value of the specified default key to the specified Boolean value.
func set(URL?, forKey: String)
//Sets the value of the specified default key to the specified URL.
Se stai memorizzando cose come le preferenze e non un set di dati di grandi dimensioni, queste sono opzioni perfettamente valide.
Doppio esempio :
Ambientazione:
let defaults = UserDefaults.standard
var someDouble:Double = 0.5
defaults.set(someDouble, forKey: "someDouble")
ottenere:
let defaults = UserDefaults.standard
var someDouble:Double = 0.0
someDouble = defaults.double(forKey: "someDouble")
Ciò che è interessante di uno dei getter è il dizionario di rappresentazione , questo pratico getter prenderà tutti i tuoi tipi di dati indipendentemente da ciò che sono e li inserirà in un bel dizionario a cui puoi accedere con il nome della stringa e fornire il tipo di dati corrispondente corretto quando chiedi indietro poiché è di tipo "qualsiasi" .
È possibile memorizzare le proprie classi e oggetti anche utilizzando func set(Any?, forKey: String)
e il func object(forKey: String) -> Any?
setter e il getter di conseguenza.
Spero che questo chiarisca maggiormente la potenza della classe UserDefaults per la memorizzazione di dati locali.
Sulla nota di quanto dovresti conservare e con quale frequenza, Hardy_Germany ha dato una buona risposta su questo post , ecco una citazione da esso
Come molti hanno già detto: non sono a conoscenza di alcuna limitazione SIZE (eccetto la memoria fisica) per archiviare i dati in un .plist (es. UserDefaults). Quindi non è una questione di QUANTO.
La vera domanda dovrebbe essere QUANTO SPESSO si scrivono valori nuovi / modificati ... E questo è legato al consumo della batteria che questo scriverà causerà.
IOS non ha alcuna possibilità di evitare una scrittura fisica su "disco" se un singolo valore viene modificato, solo per mantenere l'integrità dei dati. Per quanto riguarda UserDefaults, questo causa l'intero file riscritto sul disco.
Questo alimenta il "disco" e lo mantiene acceso per un tempo più lungo e impedisce a IOS di passare allo stato di risparmio energetico.
Qualcos'altro da notare, come menzionato dall'utente Mohammad Reza Farahani da questo post, è la natura asincrona e sincrona dell'utente Default.
Quando si imposta un valore predefinito, viene modificato in modo sincrono all'interno del processo e in modo asincrono alla memoria permanente e ad altri processi.
Ad esempio, se si salva e si chiude rapidamente il programma, è possibile notare che non salva i risultati, perché persiste in modo asincrono. Potresti non accorgertene sempre, quindi se prevedi di salvare prima di abbandonare il programma, potresti tenerne conto dandogli un po 'di tempo per terminare.
Forse qualcuno ha delle belle soluzioni per questo che può condividere nei commenti?