40 Stimmen

Speichern Sie [String] in NSUserDefaults

Ich möchte ein Swift Style String Array in NSUserDefaults speichern, aber tatsächlich sagt die "if"-Anweisung im Code, dass `returnValue` immer null ist.

Später im Code (iOS 8) möchte ich "food += ["spaghetti"]" verwenden, um neue Einträge hinzuzufügen.

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

33voto

Imanou Petit Punkte 83480

Der folgende Code sollte Ihnen helfen, Ihr Problem zu lösen:

import UIKit

class ViewController: UIViewController {

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

    override func viewDidLoad() {
        super.viewDidLoad()

        print(food) // gibt aus: ["muesli", "banana"] (beim ersten Start)

        food = ["cake"]
        print(food) // gibt aus: ["cake"]

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

        food = []
        print(food) // gibt aus: []

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

}

Jedoch, mit dem vorherigen Code, wenn Sie food = [] setzen, haben Sie ein Problem, da food nicht ["muesli", "banana"] zurückgeben wird. Um dies zu vermeiden, sollten Sie vielleicht den folgenden Code bevorzugen:

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"] //Standardwert
            }
        }
        set {
            NSUserDefaults.standardUserDefaults().setObject(newValue, forKey: "food")
            NSUserDefaults.standardUserDefaults().synchronize()
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        print(food) // gibt aus: ["muesli", "banana"] (beim ersten Start)

        food = ["cake"]
        print(food) // gibt aus: ["cake"]

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

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

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

}

13voto

pNre Punkte 5376

Wie in der Dokumentation angegeben:

Für NSArray- und NSDictionary-Objekte müssen ihre Inhalte Property-Listen-Objekte sein.

Dies bedeutet, dass Sie Ihre String-Objekte in NSString konvertieren müssen, wenn Sie sie speichern. Etwas wie das sollte funktionieren:

var food : [String] {
    get {
        var returnValue : [String]? = NSUserDefaults.standardUserDefaults().objectForKey("food") as? [String]
        if returnValue == nil      //Überprüfen Sie den ersten App-Lauf
        {
            returnValue = ["muesli", "banana"]; //Standardwert
        }
        return returnValue!
    }
    set (newValue) {
        //  Jeder Eintrag in newValue ist jetzt ein NSString
        let val = newValue as [NSString]
        NSUserDefaults.standardUserDefaults().setObject(val, forKey: "food")
        NSUserDefaults.standardUserDefaults().synchronize()
    }
}

9voto

Sina Punkte 869

In Swift 3.0

Speichern

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

Abrufen

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

Entfernen

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

Referenz: NSUserdefault objectTypes

2voto

PSS Punkte 316

NSUserDefault mit Funktion setzen und abrufen

Verwenden Sie die unten stehende Funktion, um global zu verwenden. Deklarieren Sie sie in jeder Klasse und verwenden sie in der gesamten App.

Deklaration

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
}

Wie man sie aufruft

Klassenname_wo_diese_Funktion_deklariert_ist.sharedInstance.setUserDefault("Wert", KeyToSave: "Schlüssel")**

-1voto

Nikunj Patel Punkte 300

//

    class func saveCustomObject(_ object: AnyObject?, key: String) { 
      let encodedObject = NSKeyedArchiver.archivedData(withRootObject: object!) 
      let userDefaults = UserDefaults.standard userDefaults.set(encodedObject, forKey: key) 
      userDefaults.synchronize() 
    } 

//

class func loadCustomObject(_ key: String) -> AnyObject? { 
   let userDefaults = UserDefaults.standard 
   if let userDefaultKey = userDefaults.object(forKey: key) { 
     let encodedObject = userDefaultKey as! NSData 
     return NSKeyedUnarchiver.unarchiveObject(with: encodedObject as Data)! as AnyObject? 
   } else {
     return nil 
   }
} 

//

class func removeCustomObject(_ key: String) { // 
    let encodedObject = NSKeyedArchiver.archivedDataWithRootObject(object!) let userDefaults = 
    UserDefaults.standard userDefaults.removeObject(forKey: key) 
    userDefaults.synchronize()
 }

Method aufrufen

let aParams : [String : String] = [ "DeviceType" : "iOS", ]
CommonMethods.saveCustomObject(aParams as AnyObject?, key:Constants.kLoginData)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X