我想将 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()
}
}
最佳答案
以下代码应该可以帮助您解决问题:
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"]
}
}
但是,对于前面的代码,如果您设置 food = []
,您将遇到一个问题,因为 food
不会返回 ["muesli", “香蕉”]
。为了避免这种情况,您可能更喜欢以下代码:
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"]
}
}
关于ios - 将 [String] 存储在 NSUserDefaults 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25420651/