Swift 5+
Aucune des réponses ne couvre vraiment en détail les capacités de stockage local intégrées par défaut. Il peut faire bien plus que de simples chaînes.
Vous avez les options suivantes directement à partir de la documentation Apple pour «obtenir» des données à partir des valeurs par défaut.
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.
Voici les options de 'réglage'
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.
Si vous stockez des éléments comme les préférences et non un grand ensemble de données , ce sont des options parfaitement adaptées.
Exemple double :
Réglage:
let defaults = UserDefaults.standard
var someDouble:Double = 0.5
defaults.set(someDouble, forKey: "someDouble")
Obtenir:
let defaults = UserDefaults.standard
var someDouble:Double = 0.0
someDouble = defaults.double(forKey: "someDouble")
Ce qui est intéressant à propos de l'un des getters, c'est dictionaryReprésentation , cet getter pratique prendra tous vos types de données quels qu'ils soient et les placera dans un joli dictionnaire auquel vous pouvez accéder par son nom de chaîne et donner le type de données correspondant correct lorsque vous demandez il revient car il est de type «any» .
Vous pouvez stocker vos propres classes et aussi des objets en utilisant le func set(Any?, forKey: String)
etfunc object(forKey: String) -> Any?
setter et getter en conséquence.
J'espère que cela clarifie davantage la puissance de la classe UserDefaults pour stocker des données locales.
Sur la note de combien vous devriez stocker et à quelle fréquence, Hardy_Germany a donné une bonne réponse à ce sujet sur ce post , en voici une citation
Comme beaucoup l'ont déjà mentionné: je ne connais aucune limitation de SIZE (sauf la mémoire physique) pour stocker des données dans un .plist (par exemple, UserDefaults). Ce n'est donc pas une question de COMBIEN.
La vraie question devrait être de savoir à quelle fréquence vous écrivez des valeurs nouvelles / modifiées ... Et cela est lié à l'épuisement de la batterie que cela entraînera.
IOS n'a aucune chance d'éviter une écriture physique sur "disque" si une seule valeur change, juste pour conserver l'intégrité des données. En ce qui concerne UserDefaults, tout le fichier est réécrit sur le disque.
Cela met le «disque» sous tension et le maintient sous tension plus longtemps et empêche l'IOS de passer à un état de faible consommation.
Quelque chose d'autre à noter comme mentionné par l'utilisateur Mohammad Reza Farahani à partir de ce message est la nature asynchrone et synchrone de userDefaults.
Lorsque vous définissez une valeur par défaut, elle est modifiée de manière synchrone au sein de votre processus et de manière asynchrone avec le stockage persistant et d'autres processus.
Par exemple, si vous enregistrez et fermez rapidement le programme, vous remarquerez peut-être qu'il n'enregistre pas les résultats, c'est parce qu'il persiste de manière asynchrone. Vous ne le remarquerez peut-être pas tout le temps, donc si vous prévoyez d'économiser avant de quitter le programme, vous voudrez peut-être en tenir compte en lui laissant le temps de terminer.
Peut-être que quelqu'un a quelques bonnes solutions pour cela qu'il peut partager dans les commentaires?