web-dev-qa-db-fra.com

Stocker [chaîne] dans NSUserDefaults

Je veux enregistrer un Swift Style String Array dans NSUserDefaults, mais en fait, l'instruction "if" dans le code indique que returnValue est toujours nul.

Plus tard dans le code (iOS 8), je veux utiliser "food + = [" spaghetti "] pour ajouter de nouvelles entrées.

var food : [String] {
    get {
        var returnValue : [String]? = NSUserDefaults.standardUserDefaults().objectForKey("food") as? [String]
        if returnValue == nil      //Check for first run of app
        {
            returnValue = ["muesli", "banana"]; //Default value
        }
        return returnValue!
    }
    set (newValue) {
        NSUserDefaults.standardUserDefaults().setObject(newValue, forKey: "food")
        NSUserDefaults.standardUserDefaults().synchronize()
    }
}
39
Thomas

Le code suivant devrait vous aider à résoudre votre problème:

import UIKit

class ViewController: UIViewController {

    var food: [String] {
        get {
            if let returnValue = NSUserDefaults.standardUserDefaults().objectForKey("food") as? [String] {
                return returnValue
            } else {
                return ["muesli", "banana"] //Default value
            }
        }
        set {
            NSUserDefaults.standardUserDefaults().setObject(newValue, forKey: "food")
            NSUserDefaults.standardUserDefaults().synchronize()
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        print(food) // prints: ["muesli", "banana"] (at first launch)

        food = ["cake"]
        print(food) // prints: ["cake"]

        food += ["spaghetti"]
        print(food) // prints: ["cake", "spaghetti"]

        food = []
        print(food) // prints: []

        NSUserDefaults.standardUserDefaults().setObject(nil, forKey: "food")
        print(food) // prints: ["muesli", "banana"]
    }

}

Cependant, avec le code précédent, si vous définissez food = [], vous aurez un problème car food ne retournera pas ["muesli", "banana"]. Afin d'éviter cela, vous pouvez préférer le code suivant:

import UIKit

class ViewController: UIViewController {

    var food: [String] {
        get {
            if let returnValue = NSUserDefaults.standardUserDefaults().objectForKey("food") as? [String] {
                return returnValue == [] ? ["muesli", "banana"] : returnValue
            } else {
                return ["muesli", "banana"] //Default value
            }
        }
        set {
            NSUserDefaults.standardUserDefaults().setObject(newValue, forKey: "food")
            NSUserDefaults.standardUserDefaults().synchronize()
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        print(food) // prints: ["muesli", "banana"] (at first launch)

        food = ["cake"]
        print(food) // prints: ["cake"]

        food += ["spaghetti"]
        print(food) // prints: ["cake", "spaghetti"]

        food = []
        print(food) // prints: ["muesli", "banana"]

        NSUserDefaults.standardUserDefaults().setObject(nil, forKey: "food")
        print(food) // prints: ["muesli", "banana"]
    }

}
33
Imanou Petit

Comme indiqué dans la documentation :

Pour les objets NSArray et NSDictionary, leur contenu doit être des objets de liste de propriétés.

Cela signifie que vous devez convertir vos objets String en NSString lors de l'enregistrement, quelque chose comme ceci devrait fonctionner:

var food : [String] {
    get {
        var returnValue : [String]? = NSUserDefaults.standardUserDefaults().objectForKey("food") as? [String]
        if returnValue == nil      //Check for first run of app
        {
            returnValue = ["muesli", "banana"]; //Default value
        }
        return returnValue!
    }
    set (newValue) {
        //  Each item in newValue is now a NSString
        let val = newValue as [NSString]
        NSUserDefaults.standardUserDefaults().setObject(val, forKey: "food")
        NSUserDefaults.standardUserDefaults().synchronize()
    }
}
13
pNre

Dans Swift 3.0

Boutique

UserDefaults.standard.set(newValue, forKey: "yourkey")
UserDefaults.standard.synchronize()

Récupérer

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

Supprimer

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

Référence: NSUserdefault objectTypes

7
Sina

Définir et obtenir NSUserDefault avec la fonction

Utilisez la fonction ci-dessous pour l'utiliser globalement, déclarez dans n'importe quelle classe toute utilisation dans l'application entière

Déclaration n

func setUserDefault(ObjectToSave : AnyObject?  , KeyToSave : String)
{
    let defaults = NSUserDefaults.standardUserDefaults()

    if (ObjectToSave != nil)
    {

        defaults.setObject(ObjectToSave, forKey: KeyToSave)
    }

    NSUserDefaults.standardUserDefaults().synchronize()
}

func getUserDefault(KeyToReturnValye : String) -> AnyObject?
{
    let defaults = NSUserDefaults.standardUserDefaults()

    if let name = defaults.valueForKey(KeyToReturnValye)
    {
        return name
    }
    return nil
}

Comment appeler

Classname_where_this_function_declare.sharedInstance.setUserDefault("value", KeyToSave: "key")**  
1
PSS