我想将一个Swift样式字符串数组保存到NSUserDefaults中,但实际上是" if"代码中的语句表示returnValue总是为零。
稍后在代码(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()
}
}
答案 0 :(得分: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"]
}
}
但是,使用上一代码,如果您设置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"]
}
}
答案 1 :(得分:13)
如documentation中所述:
对于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()
}
}
答案 2 :(得分:7)
在Swift 3.0中
商品强>
UserDefaults.standard.set(newValue, forKey: "yourkey")
UserDefaults.standard.synchronize()
<强>提取强>
var returnValue: [NSString]? = UserDefaults.standard.object(forKey: "yourkey") as? [NSString]
删除强>
UserDefaults.standard.removeObject(forKey: "yourkey")
答案 3 :(得分:1)
使用功能
设置并获取NSUserDefault使用以下函数全局使用,在任何类中声明在整个应用程序中使用
<强> Declaratio 强>名词
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
}
Classname_where_this_function_declare.sharedInstance.setUserDefault("value", KeyToSave: "key")**
答案 4 :(得分:-1)
//
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()
}
调用方法
let aParams : [String : String] = [ "DeviceType" : "iOS", ]
CommonMethods.saveCustomObject(aParams as AnyObject?, key:Constants.kLoginData)