Recherche…


Syntaxe

  • UserDefaults.standard.set(dic, forKey: "LoginSession") //Save value inside userdefaults

    • UserDefaults.standard.object(forKey: "LoginSession") as? [String:AnyObject] ?? [:] //Get value from UserDefaults

Remarques

NSUserDefault qui est utilisé pour stocker tout type de DataType, et vous pouvez obtenir sa valeur partout dans la classe de l'application. NSUserDéfault

Réglage des valeurs

Pour définir une valeur dans NSUserDefaults , vous pouvez utiliser les fonctions suivantes:

Swift <3

setBool(_:forKey:)
setFloat(_:forKey:)
setInteger(_:forKey:)
setObject(_:forKey:)
setDouble(_:forKey:)
setURL(_:forKey:)

Swift 3

Dans Swift 3, les noms de fonction sont modifiés pour set insted de set suivi par le type.

set(_:forKey:) 

Objectif c

-(void)setBool:(BOOL)value forKey:(nonnull NSString *)defaultName;
-(void)setFloat:(float)value forKey:(nonnull NSString *)defaultName;
-(void)setInteger:(NSInteger)value forKey:(nonnull NSString *)defaultName;
-(void)setObject:(nullable id)value forKey:(nonnull NSString *)defaultName;
-(void)setDouble:(double)value forKey:(nonnull NSString *)defaultName;
-(void)setURL:(nullable NSURL *)value forKey:(nonnull NSString *)defaultName;

Exemple d'utilisation serait:

Swift <3

NSUserDefaults.standardUserDefaults.setObject("Netherlands", forKey: "HomeCountry")

Swift 3

UserDefaults.standard.set("Netherlands", forKey: "HomeCountry")

Objectif c

[[NSUserDefaults standardUserDefaults] setObject:@"Netherlands" forKey:@"HomeCountry"];

Objets personnalisés

Pour enregistrer des objets personnalisés dans le `NSUserDefaults`, vous devez faire en sorte que votre CustomClass confirme le protocole de` NSCoding`. Vous devez implémenter les méthodes suivantes:

Rapide

public func encodeWithCoder(aCoder: NSCoder) {
    aCoder.encodeObject(name, forKey:"name")
    aCoder.encodeObject(unitId, forKey: "unitId")
}
    
required public init(coder aDecoder: NSCoder) {
    super.init()
    name = aDecoder.decodeObjectForKey("name") as? String
    unitId = aDecoder.decodeIntegerForKey("unitId") as? NSInteger
}

Objectif c

- (id)initWithCoder:(NSCoder *)coder {
    self = [super init];
    if (self) {
        name = [coder decodeObjectForKey:@"name"];
        unitId = [coder decodeIntegerForKey:@"unitId"];
    }
    return self;
}

- (void)encodeWithCoder:(NSCoder*)coder {
    [coder encodeObject:name forKey:@"name"];
    [coder encodeInteger:unitId forKey:@"unitId"];
}

Obtenir des valeurs par défaut

Pour obtenir une valeur dans NSUserDefaults, vous pouvez utiliser les fonctions suivantes:

Rapide

arrayForKey(_:)
boolForKey(_:)
dataForKey(_:)
dictionaryForKey(_:)
floatForKey(_:)
integerForKey(_:)
objectForKey(_:)
stringArrayForKey(_:)
stringForKey(_:)
doubleForKey(_:)
URLForKey(_:)

Objectif c

-(nullable NSArray *)arrayForKey:(nonnull NSString *)defaultName;
-(BOOL)boolForKey:(nonnull NSString *)defaultName;
-(nullable NSData *)dataForKey:(nonnull NSString *)defaultName;
-(nullable NSDictionary<NSString *, id> *)dictionaryForKey:(nonnull NSString *)defaultName;
-(float)floatForKey:(nonnull NSString *)defaultName;
-(NSInteger)integerForKey:(nonnull NSString *)defaultName;
-(nullable id)objectForKey:(nonnull NSString *)key;
-(nullable NSArray<NSString *> *)stringArrayForKey:(nonnull NSString *)defaultName;
-(nullable NSString *)stringForKey:(nonnull NSString *)defaultName;
-(double)doubleForKey:(nonnull NSString *)defaultName;
-(nullable NSURL *)URLForKey:(nonnull NSString *)defaultName;

Exemple d'utilisation serait:

Rapide

let homeCountry = NSUserDefaults.standardUserDefaults().stringForKey("HomeCountry")

Objectif c

NSString *homeCountry = [[NSUserDefaults standardUserDefaults] stringForKey:@"HomeCountry"];

Sauvegarder les valeurs

NSUserDefaults est écrit sur le disque régulièrement par le système, mais il NSUserDefaults que vous souhaitiez que vos modifications soient enregistrées immédiatement, par exemple lorsque l'application passe en arrière-plan. Cela se fait en appelant synchronize .

Rapide

NSUserDefaults.standardUserDefaults().synchronize()

Objectif c

[[NSUserDefaults standardUserDefaults] synchronize];

Utiliser les gestionnaires pour enregistrer et lire des données

Bien que vous puissiez utiliser les méthodes NSUserDefaults n'importe où, il est parfois préférable de définir un gestionnaire qui enregistre et lit à partir de NSUserDefaults , puis utilise ce gestionnaire pour lire ou écrire vos données.

Supposons que nous voulions enregistrer le score d'un utilisateur dans NSUserDefaults . Nous pouvons créer une classe comme celle ci-dessous qui a deux méthodes: setHighScore et highScore . Partout où vous voulez accéder aux meilleurs scores, créez une instance de cette classe.

Rapide

public class ScoreManager: NSObject {

    let highScoreDefaultKey = "HighScoreDefaultKey"

    var highScore = {
        set {
            // This method includes your implementation for saving the high score
            // You can use NSUserDefaults or any other data store like CoreData or
            // SQLite etc.
    
            NSUserDefaults.standardUserDefaults().setInteger(newValue, forKey: highScoreDefaultKey)
            NSUserDefaults.standardUserDefaults().synchronize()
        }
        get {
        //This method includes your implementation for reading the high score

            let score = NSUserDefaults.standardUserDefaults().objectForKey(highScoreDefaultKey)
    
            if (score != nil) {
                return score.integerValue;
            } else {
                //No high score available, so return -1
                return -1;
            }
        }
    }
}

Objectif c

#import "ScoreManager.h"

#define HIGHSCRORE_KEY @"highScore"

@implementation ScoreManager

- (void)setHighScore:(NSUInteger) highScore {
    // This method includes your implementation for saving the high score
    // You can use NSUserDefaults or any other data store like CoreData or
    // SQLite etc.

    [[NSUserDefaults standardUserDefaults] setInteger:highScore forKey:HIGHSCRORE_KEY];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

- (NSInteger)highScore
{

    //This method includes your implementation for reading the high score

    NSNumber *highScore = [[NSUserDefaults standardUserDefaults] objectForKey:HIGHSCRORE_KEY];
    if (highScore) {
        return highScore.integerValue;
    }else
    {
        //No high score available, so return -1

        return -1;
    }

}

@end

Les avantages sont que:

  1. L'implémentation de votre processus de lecture et d'écriture est seulement à un endroit et vous pouvez le changer (par exemple passer de NSUserDefaults à Core Data) quand vous le voulez et ne pas vous soucier de changer tous les endroits avec lesquels vous travaillez.

  2. Appelez simplement une seule méthode lorsque vous souhaitez accéder au score ou l'écrire.

  3. Déboguez-le simplement quand vous voyez un bug ou quelque chose comme ça.

Remarque

Si vous vous inquiétez de la synchronisation, il est préférable d'utiliser une classe singleton qui gère la synchronisation.

Effacer NSUserDefaults

Rapide

let bundleIdentifier = NSBundle.mainBundle().bundleIdentifier()

NSUserDefaults.standardUserDefaults().removePersistentDomainForName(bundleIdentifier)

Objectif c

NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier];

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName: bundleIdentifier];

UserDefaults utilise dans Swift 3

Chaque application nécessaire pour stocker les détails liés à la session utilisateur ou à l’utilisateur dans l’application dans UserDefaults. Nous avons donc intégré toute une logique à une classe pour mieux gérer UserDefaults.

Swift 3

import Foundation

public struct Session {

    fileprivate static let defaults = UserDefaults.standard

    enum userValues: String {
        case auth_token
        case email
        case fname
        case mobile
        case title
        case userId
        case userType
        case OTP
        case isApproved
    }
    
    
    //MARK: - Getting here User Details
    static func getUserSessionDetails()->[String:AnyObject]? {
        let dictionary = defaults.object(forKey: "LoginSession") as? [String:AnyObject]
        return  dictionary
    }
    
    //MARK: - Saving Device Token
    static func saveDeviceToken(_ token:String){
        guard (gettingDeviceToken() ?? "").isEmpty else {
            return
        }
        defaults.removeObject(forKey: "deviceToken")
        defaults.set(token, forKey: "deviceToken")
        defaults.synchronize()
    }
    
    //MARK: - Getting Token here
    static func gettingDeviceToken()->String?{
        let token = defaults.object(forKey: "deviceToken") as? String
        if token == nil{
            return ""
        }else{ return token}
    }
    
    //MARK: - Setting here User Details
    static func setUserSessionDetails(_ dic :[String : AnyObject]){
        defaults.removeObject(forKey: "LoginSession")
        defaults.set(dic, forKey: "LoginSession")
        defaults.synchronize()
    }
    
    //MARK:- Removing here all Default Values
    static func userSessionLogout(){
        //Set Activity
        defaults.removeObject(forKey: "LoginSession")
        defaults.synchronize()
    }
    
    //MARK: - Get value from session here
    static func getUserValues(value: userValues) -> String? {
        let dic = getUserSessionDetails() ?? [:]
        guard let value = dic[value.rawValue] else{
            return ""
        }
        return value as? String
    }
    
}

Utilisation de la classe UserDefaults

//Saving user Details
Session.setUserSessionDetails(json ?? [:])

//Retriving user Details 
let userId = Session.getUserValues(value: .userId) ?? ""


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow