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


105

Je porte une application Android sur iOS, une chose que j'ai utilisée était les préférences partagées dans 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 au niveau 3 ou autre.

Existe-t-il un mécanisme similaire dans iOS? ou dois-je écrire manuellement dans un fichier spécifique à une application?

Si tel est le cas, comment écrire dans des fichiers uniquement visibles par mon application?

Merci.


1
Je suppose que la chose la plus proche de cela dans iOS est NSUserDefaults . Et voici un exemple simple de sauvegarde et de récupération.
Tarek Hallak

Réponses:


203

Utilisez NSUserDefaults : - notez qu'il s'agit de petits bits de données, comme le niveau actuel comme vous l'avez mentionné. N'abusez pas de cela et utilisez-la comme une grande base de données, car elle est chargée en mémoire chaque fois que vous ouvrez votre application, que vous en ayez besoin ou non (d'autres parties de votre application l'utiliseront également).

Objectif c:

En train de lire:

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

NSString *currentLevelKey = @"currentlevel";

if ([preferences objectForKey:currentLevelKey] == nil)
{
    //  Doesn't exist.
}
else
{
    //  Get current level
    const NSInteger currentLevel = [preferences integerForKey:currentLevelKey];
}

L'écriture:

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

NSString *currentLevelKey = @"currentlevel";

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

//  Save to disk
const BOOL didSave = [preferences synchronize];

if (!didSave)
{
    //  Couldn't save (I've never seen this happen in real world testing)
}

.

Rapide:

En train de lire:

let preferences = NSUserDefaults.standardUserDefaults()

let currentLevelKey = "currentLevel"

if preferences.objectForKey(currentLevelKey) == nil {
    //  Doesn't exist
} else {
    let currentLevel = preferences.integerForKey(currentLevelKey)
}

L'écriture:

let preferences = NSUserDefaults.standardUserDefaults()

let currentLevelKey = "currentLevel"

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

//  Save to disk
let didSave = preferences.synchronize()

if !didSave {
    //  Couldn't save (I've never seen this happen in real world testing)
}

Vous pouvez également utiliser la liaison conditionnelle pour la lecture dans swift if let savedLevel = preferences.integerForKey(currentLevelKey) { currentLevel = savedLevel}
Raghu Teja

4
@chitti non qui ne fonctionnera pas, integerForKey ne renvoie pas une option
SomeGuy

40

Voici une mise à jour pour Swift 3

En train de lire

let preferences = UserDefaults.standard

let currentLevelKey = "currentLevel"
if preferences.object(forKey: currentLevelKey) == nil {
    //  Doesn't exist
} else {
    let currentLevel = preferences.integer(forKey: currentLevelKey)
}

L'écriture

let preferences = UserDefaults.standard

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

Mettre à jour

À partir 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 désormais inutile et ne doit pas être utilisée.


2
class Configuration {

    static func value<T>(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")

-1

Selon la réponse précédente, vous savez déjà que UserDefaultsc'est l'équivalent des préférences partagées dans iOS. Vous pouvez créer une fonction d'écriture commune et une fonction de création de lecture en fonction du type de données. Et appelez votre méthode souhaitée de n'importe où.

ViewController.swift

 // write data
 writeAnyData(key: "MY_KEY", value: "MyData")
 // read string data 
 readStringData(key: "MY_KEY"), animated: true)

Utils.swift

// read and write user default
let userDefault = UserDefaults.standard
// write
func writeAnyData(key: String, value: Any){
    userDefault.set(value, forKey: key)
    userDefault.synchronize()
}

// read int values
func readIntData(key: String) -> Int{
    if userDefault.object(forKey: key) == nil {
        return 0
    } else {
        return userDefault.integer(forKey: key)
    }
}

// read string values
func readStringData(key: String) -> String{
    if userDefault.object(forKey: key) == nil {
        return ""
    } else {
        return userDefault.string(forKey: key)!
    }
}
// read bool value
func readBoolData(key: String) -> Bool{
    if userDefault.object(forKey: key) == nil {
        return false
    } else {
        return userDefault.bool(forKey: key)
    }
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.