Estoy trabajando en una pequeña aplicación para iPhone, y la estoy usando NSUserDefaults
como mi persistencia de datos. Solo tiene que hacer un seguimiento de algunas cosas, como algunos nombres y algunos números, por lo que creo que también podría ser simple.
Encontré esta página como referencia, pero no creo que pueda responder a mi pregunta. Básicamente, quiero poder verificar si un valor (o una clave) ya existe en el NSUserDefaults
y luego hacer algo en consecuencia.
Algunos ejemplos: la aplicación se inicia, si es la primera vez que se inicia, emite una alerta que dice bienvenida. Para saber si es la primera vez que se abre, lee UserDefaults
y comprueba.
Ejemplo 2: Dice "Hola [Nombre]", donde Nombre es algo que ha ingresado. Si ha abierto la aplicación y no hay nombre, debería decir "Hola Mundo". Necesito verificar si ya ha ingresado un nombre y actuar en consecuencia. El nombre se almacenaría enNSUserDefaults
.
¿Alguna ayuda aquí? Realmente lo apreciaría!
fuente
– dictionaryRepresentation
y verificar la clave.Como se mencionó anteriormente, no funcionará para tipos primitivos donde 0 / NO podría ser un valor válido. Estoy usando este código.
fuente
BOOL
. Distinguirá con precisión entreNO
y no establecido, a diferenciaobjectForKey:
.objectForKey:
volveránil
independientemente de la intención del programador de almacenar eventualmente unoBool
o cualquier otro tipo de datos. Cuando hay una primitiva presente,objectForKey:
no regresanil
incluso si la clave está asociada con un valor primitivo.El
objectForKey:
método devolveránil
si el valor no existe. Aquí hay una simple prueba IF / THEN que le dirá si el valor es nulo:fuente
" objectForKey devolverá nil si no existe. " También devolverá nil si existe y es un entero o un booleano con un valor de cero (es decir, FALSO o NO para el booleano).
He probado esto en el simulador para 5.1 y 6.1. Esto significa que no se puede probar si se han establecido enteros o booleanos preguntando "el objeto". Puede salirse con la suya para enteros si no le importa tratar "no establecido" como si fuera "establecido a cero".
Las personas que ya probaron esto parecen haber sido engañadas por el aspecto falso negativo, es decir, probar esto al ver si objectForKey devuelve nil cuando se sabe que la clave no se ha configurado, pero no se da cuenta de que también devuelve nil si la clave ha sido establecido pero se ha establecido en NO.
Para mi propio problema, que me envió aquí, terminé cambiando la semántica de mi booleano para que mi valor predeterminado deseado estuviera en congruencia con el valor establecido en NO. Si esa no es una opción, deberá almacenar como algo distinto de un valor booleano y asegurarse de que puede distinguir entre SÍ, NO y "no establecido".
fuente
@0
en lugar de0
, en@NO
lugar deNO
o simplemente@(variable)
. Lee sobre ellos aquí.Swift 3/4:
Aquí hay una extensión simple para los tipos de valor clave Int / Double / Float / Bool que imitan el comportamiento de retorno opcional de los otros tipos a los que se accede a través de UserDefaults.
( Editar 30 de agosto de 2018: actualizado con una sintaxis más eficiente a partir de la sugerencia de Leo).
Ahora son más consistentes junto con los otros métodos de obtención incorporados (cadena, datos, etc.). Simplemente use los métodos get en lugar de los antiguos.
fuente
return self.object(forKey: key) as? Int
buscar valor solo una vez.Acabo de pasar por esto, y todo sus respuestas me ayudaron a encontrar una buena solución para mí. Me resistí a seguir la ruta sugerida, solo porque me resultaba difícil de leer y comprender.
Esto es lo que hice. Tenía un BOOL transportado en una variable llamada "_talkative".
Cuando configuré mi objeto predeterminado (NSUserDefaults), lo configuré como un objeto, ya que luego pude probar para ver si era nulo:
Luego, cuando fui a ver si existía, solía:
Luego usé el objeto como BOOL:
Esto parece funcionar en mi caso. Simplemente tenía más sentido visual para mí.
fuente
Prueba este pequeño bollo:
Trata todo como un objeto. Parece funcionar para mi.
fuente
Versión rápida para obtener
Bool?
fuente
boolForKey
?NSUserDefaults.standardUserDefaults().boolForKey(DefaultsIsGiver)
boolForKey
volveráBool
y noBool?
, así que si la clave no está allí, lo conseguirásfalse
y no lo harásnil
Extienda
UserDefaults
una vez para no copiar y pegar esta solución:fuente
En Swift3, he usado de esta manera
La respuesta es excelente si vas a usar eso varias veces.
Espero que ayude :)
fuente
Swift 3.0
fuente