131 votes

Équivalent iOS pour les préférences partagées Android

Je suis en train de porter une application Android sur iOS, une chose que j'ai utilisée était les Shared Preferences sur Android pour enregistrer chaque fois qu'un niveau était terminé.

De cette façon, lorsque l'utilisateur revient dans l'application, il peut voir qu'il est arrivé au niveau 3 ou autre.

Y a-t-il un mécanisme similaire sur iOS? Ou dois-je écrire manuellement dans un fichier spécifique à l'application?

Si c'est le cas, comment puis-je écrire dans des fichiers uniquement visibles pour mon application?

Merci.

229voto

SomeGuy Points 1971

Utilisez NSUserDefaults: - Notez que ceci est pour de petites quantités de données, telles que le niveau actuel que vous avez mentionné. Ne pas en abuser et l'utiliser comme une base de données volumineuse, car elle est chargée en mémoire à chaque fois que vous ouvrez votre application, que vous ayez besoin de quelque chose ou non (d'autres parties de votre application l'utiliseront également).

Objective-C:

Lecture:

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

NSString *currentLevelKey = @"currentlevel";

if ([preferences objectForKey:currentLevelKey] == nil)
{
    //  N'existe pas.
}
else
{
    //  Obtenez le niveau actuel
    const NSInteger currentLevel = [preferences integerForKey:currentLevelKey];
}

Écriture:

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

NSString *currentLevelKey = @"currentlevel";

const NSInteger currentLevel = ...;
[preferences setInteger:currentLevel forKey:currentLevelKey];

//  Enregistrer sur le disque
const BOOL didSave = [preferences synchronize];

if (!didSave)
{
    //  Impossible d'enregistrer (je n'ai jamais vu cela se produire dans des tests en monde réel)
}

.

Swift:

Lecture:

let preferences = NSUserDefaults.standardUserDefaults()

let currentLevelKey = "currentLevel"

if preferences.objectForKey(currentLevelKey) == nil {
    //  N'existe pas
} else {
    let currentLevel = preferences.integerForKey(currentLevelKey)
}

Écriture:

let preferences = NSUserDefaults.standardUserDefaults()

let currentLevelKey = "currentLevel"

let currentLevel = ...
preferences.setInteger(currentLevel, forKey: currentLevelKey)

//  Enregistrer sur le disque
let didSave = preferences.synchronize()

if !didSave {
    //  Impossible d'enregistrer (je n'ai jamais vu cela se produire dans des tests en monde réel)
}

53voto

Ben Points 492

Voici une mise à jour pour Swift 3

Lecture

let preferences = UserDefaults.standard

let currentLevelKey = "currentLevel"
if preferences.object(forKey: currentLevelKey) == nil {
    //  n'existe pas
} else {
    let currentLevel = preferences.integer(forKey: currentLevelKey)
}

Écriture

let preferences = UserDefaults.standard

let currentLevel = ...
let currentLevelKey = "currentLevel"
preferences.set(currentLevel, forKey: currentLevelKey)

Mise à jour

De la documentation UserDefaults

synchronize() attend les mises à jour asynchrones en attente de la base de données par défaut et retourne ; cette méthode est maintenant inutile et ne doit pas être utilisée.

7voto

Hasanaga Points 889
class Configuration {

    static func value(defaultValue: T, forKey key: String) -> T{

        let preferences = UserDefaults.standard
        return preferences.object(forKey: key) == nil ? defaultValue : preferences.object(forKey: key) as! T
    }

    static func value(value: Any, forKey key: String){

        UserDefaults.standard.set(value, forKey: key)
    }

}

Exemple

//set
Configuration.value(value: "my_value", forKey: "key_1")

//get
let myValue = Configuration.value(defaultValue: "default_value", forKey: "key_1")

2voto

Md Imran Choudhury Points 2536

Comme mentionné dans la réponse précédente, vous savez déjà que UserDefaults est l'équivalent des préférences partagées dans iOS. Vous pouvez créer une fonction d'écriture commune et une fonction de lecture basée sur le type de données. Et appelez votre méthode requise de n'importe où.

ViewController.swift

// écrire des données
écrireDesDonnées(key: "MY_KEY", value: "MesDonnées")
// lire des données de type chaîne
lireDesDonnéesDeChaîne(key: "MY_KEY"), animé: true)

Utils.swift

// lire et écrire dans les préférences utilisateur
let userDefault = UserDefaults.standard
// écrire
func écrireDesDonnées(key: String, value: Any){
    userDefault.set(value, forKey: key)
    userDefault.synchronize()
}

// lire des valeurs entières
func lireDesDonnéesEntières(key: String) -> Int{
    if userDefault.object(forKey: key) == nil {
        return 0
    } else {
        return userDefault.integer(forKey: key)
    }
}

// lire des valeurs de chaîne
func lireDesDonnéesDeChaîne(key: String) -> String{
    if userDefault.object(forKey: key) == nil {
        return ""
    } else {
        return userDefault.string(forKey: key)!
    }
}
// lire une valeur booléenne
func lireDesDonnéesBooléennes(key: String) -> Bool{
    if userDefault.object(forKey: key) == nil {
        return false
    } else {
        return userDefault.bool(forKey: key)
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X