ios - standard - ¿Cómo puedo usar UserDefaults en Swift?
user preferences swift (11)
¿Cómo puedo usar UserDefaults para guardar / recuperar cadenas, booleanos y otros datos en Swift?
Diría que la respuesta de Anbu está perfectamente bien, pero tuve que agregar guardia mientras buscaba las preferencias para que mi programa no fallara
Aquí está el fragmento de código actualizado en Swift 5
Almacenar datos en Preferencias
@IBAction func savePreferenceData(_ sender: Any) {
print("Storing data..")
UserDefaults.standard.set("RDC", forKey: "UserName") //String
UserDefaults.standard.set("TestPass", forKey: "Passowrd") //String
UserDefaults.standard.set(21, forKey: "Age") //Integer
}
Obteniendo datos de Preferencias
@IBAction func fetchPreferenceData(_ sender: Any) {
print("Fetching data..")
//added guard
guard let uName = UserDefaults.standard.string(forKey: "UserName") else { return }
print("User Name is :"+uName)
print(UserDefaults.standard.integer(forKey: "Age"))
}
En la clase
A
, establezca el valor para la clave:
let text = "hai"
UserDefaults.standard.setValue(text, forKey: "textValue")
En la clase
B
, obtenga el valor del texto utilizando la clave que declaró en la clase
A
y asígnelo a la variable respectiva que necesita:
var valueOfText = UserDefaults.value(forKey: "textValue")
Guardé NSDictionary normalmente y pude obtenerlo correctamente.
dictForaddress = placemark.addressDictionary! as NSDictionary
let userDefaults = UserDefaults.standard
userDefaults.set(dictForaddress, forKey:Constants.kAddressOfUser)
// Para obtener datos de NSDictionary.
let userDefaults = UserDefaults.standard
let dictAddress = userDefaults.object(forKey: Constants.kAddressOfUser) as! NSDictionary
La mejor manera de usar UserDefaults
Pasos
- Crear extensión de UserDefaults
- Crear enumeración con claves necesarias para almacenar en local
- Almacene y recupere los datos locales donde quiera
Muestra
extension UserDefaults{
//MARK: Check Login
func setLoggedIn(value: Bool) {
set(value, forKey: UserDefaultsKeys.isLoggedIn.rawValue)
//synchronize()
}
func isLoggedIn()-> Bool {
return bool(forKey: UserDefaultsKeys.isLoggedIn.rawValue)
}
//MARK: Save User Data
func setUserID(value: Int){
set(value, forKey: UserDefaultsKeys.userID.rawValue)
//synchronize()
}
//MARK: Retrieve User Data
func getUserID() -> Int{
return integer(forKey: UserDefaultsKeys.userID.rawValue)
}
}
enumeración para claves utilizadas para almacenar datos
enum UserDefaultsKeys : String {
case isLoggedIn
case userID
}
Guardar en UserDefaults donde quieras
UserDefaults.standard.setLoggedIn(value: true) // String
UserDefaults.standard.setUserID(value: result.User.id!) // String
Recupere datos en cualquier lugar de la aplicación
print("ID : /(UserDefaults.standard.getUserID())")
UserDefaults.standard.getUserID()
Eliminar valores
UserDefaults.standard.removeObject(forKey: UserDefaultsKeys.userID)
De esta manera, puede almacenar datos primitivos de la mejor manera.
Actualización No necesita usar syncize () para almacenar los valores. Como @Moritz señaló que es innecesario y le dio el artículo al respecto. Consulte los comentarios para obtener más detalles
Puede usar
NSUserDefaults
de forma rápida de esta manera,
@IBAction func writeButton(sender: UIButton)
{
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject("defaultvalue", forKey: "userNameKey")
}
@IBAction func readButton(sender: UIButton)
{
let defaults = NSUserDefaults.standardUserDefaults()
let name = defaults.stringForKey("userNameKey")
println(name) //Prints defaultvalue in console
}
Swift 4, he usado Enum para manejar UserDefaults.
Esto es solo un código de muestra. Puede personalizarlo según sus requisitos.
Para almacenar, recuperar, eliminar. De esta manera, simplemente agregue una clave para su clave UserDefaults a la enumeración. Maneje valores mientras obtiene y almacena de acuerdo con dataType y sus requisitos.
enum UserDefaultsConstant : String {
case AuthToken, FcmToken
static let defaults = UserDefaults.standard
//Store
func setValue(value : Any) {
switch self {
case .AuthToken,.FcmToken:
if let _ = value as? String {
UserDefaults.standard.set(value, forKey: self.rawValue)
}
break
}
UserDefaults.standard.synchronize()
}
//Retrieve
func getValue() -> Any? {
switch self {
case .AuthToken:
if(UserDefaults.standard.value(forKey: UserDefaultsConstant.AuthToken.rawValue) != nil) {
return "Bearer "+(UserDefaults.standard.value(forKey: UserDefaultsConstant.AuthToken.rawValue) as! String)
}
else {
return ""
}
case .FcmToken:
if(UserDefaults.standard.value(forKey: UserDefaultsConstant.FcmToken.rawValue) != nil) {
print(UserDefaults.standard.value(forKey: UserDefaultsConstant.FcmToken.rawValue))
return (UserDefaults.standard.value(forKey: UserDefaultsConstant.FcmToken.rawValue) as! String)
}
else {
return ""
}
}
}
//Remove
func removeValue() {
UserDefaults.standard.removeObject(forKey: self.rawValue)
UserDefaults.standard.synchronize()
}
}
Para almacenar un valor en los valores predeterminados del usuario,
if let authToken = resp.data?.token {
UserDefaultsConstant.AuthToken.setValue(value: authToken)
}
Para recuperar un valor de los valores predeterminados del usuario,
//As AuthToken value is a string
(UserDefaultsConstant.AuthToken.getValue() as! String)
Swift 5 y superior:
let defaults = UserDefaults.standard
defaults.set(25, forKey: "Age")
let savedInteger = defaults.integer(forKey: "Age")
defaults.set(true, forKey: "UseFaceID")
let savedBoolean = defaults.bool(forKey: "UseFaceID")
defaults.set(CGFloat.pi, forKey: "Pi")
defaults.set("Your Name", forKey: "Name")
defaults.set(Date(), forKey: "LastRun")
let array = ["Hello", "World"]
defaults.set(array, forKey: "SavedArray")
let savedArray = defaults.object(forKey: "SavedArray") as? [String] ?? [String()
let dict = ["Name": "Your", "Country": "YourCountry"]
defaults.set(dict, forKey: "SavedDict")
let savedDictionary = defaults.object(forKey: "SavedDictionary") as? [String: String] ?? [String: String]()
:)
ref: NSUserdefault objectTypes
Swift 3 y superior
Almacenar
UserDefaults.standard.set(true, forKey: "Key") //Bool
UserDefaults.standard.set(1, forKey: "Key") //Integer
UserDefaults.standard.set("TEST", forKey: "Key") //setObject
Recuperar
UserDefaults.standard.bool(forKey: "Key")
UserDefaults.standard.integer(forKey: "Key")
UserDefaults.standard.string(forKey: "Key")
retirar
UserDefaults.standard.removeObject(forKey: "Key")
Eliminar todas las llaves
if let appDomain = Bundle.main.bundleIdentifier {
UserDefaults.standard.removePersistentDomain(forName: appDomain)
}
Swift 2 y abajo
Almacenar
NSUserDefaults.standardUserDefaults().setObject(newValue, forKey: "yourkey")
NSUserDefaults.standardUserDefaults().synchronize()
Recuperar
var returnValue: [NSString]? = NSUserDefaults.standardUserDefaults().objectForKey("yourkey") as? [NSString]
retirar
NSUserDefaults.standardUserDefaults().removeObjectForKey("yourkey")
Nombre del conjunto de valores predeterminados del usuario
otro nombre de conjunto de propiedades, principalmente utilizado para el concepto de Grupos de aplicaciones , el escenario de ejemplo que tomé desde here :
El caso de uso es que quiero separar mis valores predeterminados de usuario (diferentes lógicas comerciales pueden requerir que los valores predeterminados de usuario se agrupen por separado) por un identificador como las Preferencias Compartidas de Android. Por ejemplo, cuando un usuario en mi aplicación hace clic en el botón de cerrar sesión, me gustaría borrar los valores predeterminados relacionados con su cuenta, pero no la ubicación del dispositivo.
let user = UserDefaults(suiteName:"User")
uso de userDefaults sincronizar , la información detallada se ha agregado en la respuesta duplicada.
Swift 4 :
Almacenar
UserDefaults.standard.set(object/value, forKey: "key_name")
Recuperar
var returnValue: [datatype]? = UserDefaults.standard.object(forKey: "key_name") as? [datatype]
retirar
UserDefaults.standard.removeObject(forKey:"key_name")
//Save
NSUserDefaults.standardUserDefaults().setObject("yourString", forKey: "YourStringKey")
//retrive
let yourStr : AnyObject? = NSUserDefaults.standardUserDefaults().objectForKey("YourStringKey")
class UserDefaults_WorstPresidentName {
static let key = "appname.worstPresidentName"
static var value: String? {
get {
return UserDefaults.standard.string(forKey: key)
}
set {
if newValue != nil {
UserDefaults.standard.set(newValue, forKey: key)
} else {
UserDefaults.standard.removeObject(forKey: key)
}
}
}
}