Store [String] in NSUserDefaults Store [String] in NSUserDefaults swift swift

Store [String] in NSUserDefaults


The following code should help you resolve your problem:

import UIKitclass 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"]    }}

However, with the previous code, if you set food = [], you will have a problem as food won't return ["muesli", "banana"]. In order to avoid this, you may prefer the following code:

import UIKitclass 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"]    }}


As stated in the documentation:

For NSArray and NSDictionary objects, their contents must be property list objects.

This means you need to convert your String objects to NSString when saving, something like this should work:

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


In Swift 3.0

Store

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

Retrieve

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

Remove

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

Reference: NSUserdefault objectTypes