Swift 5+
Ninguna de las respuestas cubre en detalle las capacidades de almacenamiento local integradas por defecto. Puede hacer mucho más que solo cadenas.
Tiene las siguientes opciones directamente de la documentación de Apple para 'obtener' datos de los valores predeterminados.
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.
Estas son las opciones para 'configurar'
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 almacena cosas como preferencias y no un conjunto de datos grande, estas son opciones perfectamente adecuadas.
Doble ejemplo :
Ajuste:
let defaults = UserDefaults.standard
var someDouble:Double = 0.5
defaults.set(someDouble, forKey: "someDouble")
Consiguiendo:
let defaults = UserDefaults.standard
var someDouble:Double = 0.0
someDouble = defaults.double(forKey: "someDouble")
Lo interesante de uno de los captadores es la representación del diccionario , este práctico captador tomará todos sus tipos de datos independientemente de cuáles sean y los colocará en un buen diccionario al que puede acceder por su nombre de cadena y le dará el tipo de datos correspondiente correcto cuando solicite lo devuelve ya que es del tipo 'any' .
Puede almacenar sus propias clases y objetos también utilizando el func set(Any?, forKey: String)
y func object(forKey: String) -> Any?
setter y getter en consecuencia.
Espero que esto aclare más el poder de la clase UserDefaults para almacenar datos locales.
Sobre la nota de cuánto debe almacenar y con qué frecuencia, Hardy_Germany dio una buena respuesta al respecto en esta publicación , aquí hay una cita de él
Como muchos ya mencionaron: no conozco ninguna limitación de TAMAÑO (excepto la memoria física) para almacenar datos en un .plist (por ejemplo, UserDefaults). Entonces no se trata de CUÁNTO.
La verdadera pregunta debería ser CUÁNTAS veces escribe valores nuevos / modificados ... Y esto está relacionado con el consumo de batería que esto causará.
IOS no tiene ninguna posibilidad de evitar una escritura física en el "disco" si cambia un solo valor, solo para mantener la integridad de los datos. En cuanto a los valores predeterminados del usuario, esto hace que todo el archivo se reescriba en el disco.
Esto enciende el "disco" y lo mantiene encendido durante más tiempo y evita que el IOS pase al estado de baja energía.
Algo más a tener en cuenta según lo mencionado por el usuario Mohammad Reza Farahani de esta publicación es la naturaleza asincrónica y sincrónica de los valores predeterminados del usuario.
Cuando establece un valor predeterminado, se cambia sincrónicamente dentro de su proceso y de forma asíncrona a almacenamiento persistente y otros procesos.
Por ejemplo, si guarda y cierra rápidamente el programa, puede notar que no guarda los resultados, esto se debe a que persiste de forma asincrónica. Es posible que no lo note todo el tiempo, por lo que si planea ahorrar antes de salir del programa, es posible que desee dar cuenta de esto dándole un poco de tiempo para terminar.
¿Quizás alguien tiene algunas buenas soluciones para esto que pueden compartir en los comentarios?