web-dev-qa-db-fra.com

Comment utiliser UserDefaults dans Swift?

Comment utiliser UserDefaults pour enregistrer/récupérer des chaînes, des booléens et d'autres données dans Swift?

71
Mithun R.

ref: NSUserdefault objectTypes

Swift 3 et plus

Le magasin

UserDefaults.standard.set(true, forKey: "Key") //Bool
UserDefaults.standard.set(1, forKey: "Key")  //Integer
UserDefaults.standard.set("TEST", forKey: "Key") //setObject

Récupérer

 UserDefaults.standard.bool(forKey: "Key")
 UserDefaults.standard.integer(forKey: "Key")
 UserDefaults.standard.string(forKey: "Key")

Retirer

 UserDefaults.standard.removeObject(forKey: "Key")

Supprimer toutes les clés

 if let appDomain = Bundle.main.bundleIdentifier {
UserDefaults.standard.removePersistentDomain(forName: appDomain)
 }

Swift 2 et moins

Le magasin

NSUserDefaults.standardUserDefaults().setObject(newValue, forKey: "yourkey")
NSUserDefaults.standardUserDefaults().synchronize()

Récupérer

  var returnValue: [NSString]? = NSUserDefaults.standardUserDefaults().objectForKey("yourkey") as? [NSString]

Retirer

 NSUserDefaults.standardUserDefaults().removeObjectForKey("yourkey")

Nom de la suite UserDefaults

une autre propriété nom de la suite , principalement utilisé pour Concept de groupes d’applications , exemple de scénario tiré de ici :

Le cas d’utilisation est que je souhaite séparer mes UserDefaults (une logique d’entreprise différente peut nécessiter que les Userdefaults soient regroupés séparément) par un identifiant similaire aux SharedPreferences d’Android. Par exemple, lorsqu'un utilisateur de mon application clique sur le bouton de déconnexion, je souhaite supprimer les paramètres par défaut de son compte, mais pas l'emplacement du périphérique.

let user = UserDefaults(suiteName:"User")

utilisation de userDefaults synchronize , les informations détaillées ont été ajoutées à la réponse dupliquée.

229
Anbu.Karthik

Meilleure façon d'utiliser UserDefaults  

Pas

  1. Créer une extension de UserDefaults 
  2. Créer une énumération avec les clés requises tostore in local 
  3. Stockez et récupérez les données locales où vous voulez

Échantillon  

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)
    }
}

enum for Touches utilisées pour stocker des données

enum UserDefaultsKeys : String {
    case isLoggedIn
    case userID
}

Enregistrer dans UserDefaults où vous voulez 

UserDefaults.standard.setLoggedIn(value: true)          // Bool
UserDefaults.standard.setUserID(value: result.User.id!) // String

Récupérer des données n'importe où dans l'application

print("ID : \(UserDefaults.standard.getUserID())")
UserDefaults.standard.getUserID()

Supprimer des valeurs

UserDefaults.standard.removeObject(forKey: UserDefaultsKeys.userID) 

De cette façon, vous pouvez stocker des données primitives au mieux.

Update Vous n’avez pas besoin de synchroniser () pour stocker les valeurs. Comme @Moritz le soulignait inutile et compte tenu de l'article à ce sujet. Vérifiez les commentaires pour plus de détails

19
iSrinivasan27

Swift 4 :

Le magasin

    UserDefaults.standard.set(object/value, forKey: "key_name")

Retrive

    var returnValue: [datatype]? = UserDefaults.standard.object(forKey: "key_name") as? [datatype]

Retirer

    UserDefaults.standard.removeObject(forKey:"key_name") 
10
Nikunj Joshi

Vous pouvez utiliser NSUserDefaults dans Swift de cette façon,

@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
}
2
DHEERAJ

Swift 5 et plus:

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]()

:)

1
Xab Ion

J'ai enregistré NSDictionary normalement et capable de l'obtenir correctement. 

 dictForaddress = placemark.addressDictionary! as NSDictionary
        let userDefaults = UserDefaults.standard
        userDefaults.set(dictForaddress, forKey:Constants.kAddressOfUser)

// Pour obtenir des données de NSDictionary.

let userDefaults = UserDefaults.standard
    let dictAddress = userDefaults.object(forKey: Constants.kAddressOfUser) as! NSDictionary
1
Chandni
//Save
NSUserDefaults.standardUserDefaults().setObject("yourString", forKey: "YourStringKey")

//retrive
let yourStr : AnyObject? = NSUserDefaults.standardUserDefaults().objectForKey("YourStringKey")
1
Dharmesh
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)
            }
        }
    }
}
0
neoneye

Je dirais la réponse d'Anbu parfaitement, mais je devais ajouter une protection tout en cherchant les préférences pour que mon programme échoue

Voici le code mis à jour dans Swift 5

Stockage des données dans les préférences

@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

    }

Récupération des données depuis les préférences

    @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"))
    }
0
swiftBoy

Dans la classe A, définissez la valeur de la clé:

let text = "hai"  
UserDefaults.standard.setValue(text, forKey: "textValue")

Dans la classe B, obtenez la valeur du texte à l'aide de la clé déclarée dans la classe A et affectez-la à la variable respective dont vous avez besoin:

var valueOfText  = UserDefaults.value(forKey: "textValue")
0
K.Gowri Manohari