将[String]存储在NSUserDefaults中

Tho*_*mas 39 string nsuserdefaults nsarray ios swift

我想将Swift样式字符串数组保存到NSUserDefaults中,但实际上代码中的"if"语句表示returnValue始终为nil.

稍后在代码(iOS 8)中我想使用"food + = ["spaghetti"]添加新条目.

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()
    }
}
Run Code Online (Sandbox Code Playgroud)

Ima*_*tit 33

以下代码可以帮助您解决问题:

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

}
Run Code Online (Sandbox Code Playgroud)

但是,使用上面的代码,如果设置food = [],则会出现food无法返回的问题["muesli", "banana"].为避免这种情况,您可能更喜欢以下代码:

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

}
Run Code Online (Sandbox Code Playgroud)


pNr*_*Nre 13

文档中所述:

对于NSArray和NSDictionary对象,其内容必须是属性列表对象.

这意味着你需要在保存时将String对象转换为NSString这样的东西:

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()
    }
}
Run Code Online (Sandbox Code Playgroud)


Sin*_*ina 9

在Swift 3.0中

商店

UserDefaults.standard.set(newValue, forKey: "yourkey")
UserDefaults.standard.synchronize()
Run Code Online (Sandbox Code Playgroud)

取回

var returnValue: [NSString]? = UserDefaults.standard.object(forKey: "yourkey") as? [NSString]
Run Code Online (Sandbox Code Playgroud)

去掉

UserDefaults.standard.removeObject(forKey: "yourkey")
Run Code Online (Sandbox Code Playgroud)

参考:NSUserdefault objectTypes