ios 在 NSUserDefaults 中存储 [String]
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/25420651/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Store [String] in NSUserDefaults
提问by Thomas
I want to save a Swift Style String Array into NSUserDefaults, but acutally the "if" statement in the code says that returnValue is always nil.
我想将 Swift 样式字符串数组保存到 NSUserDefaults 中,但实际上代码中的“if”语句表示 returnValue 始终为零。
Later in the code (iOS 8) I want to use "food += ["spaghetti"] to add new entries.
稍后在代码(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()
}
}
采纳答案by Imanou Petit
The following code should help you resolve your problem:
以下代码应该可以帮助您解决问题:
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"]
}
}
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:
但是,在前面的代码中,如果设置了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"]
}
}
回答by pNre
As stated in the documentation:
如文档中所述:
For NSArray and NSDictionary objects, their contents must be property list objects.
对于 NSArray 和 NSDictionary 对象,它们的内容必须是属性列表对象。
This means you need to convert your String
objects to NSString
when saving, something like this should work:
这意味着您需要在保存时将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()
}
}
回答by Sina
In Swift 3.0
在 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
回答by PSS
Set and Get NSUserDefault with function
使用函数设置和获取 NSUserDefault
Use below function to globally use , declare in any class any use in whole app
使用下面的函数全局使用,在任何类中声明在整个应用程序中的任何使用
Declaration
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
}
How to call
如何打电话
Classname_where_this_function_declare.sharedInstance.setUserDefault("value", KeyToSave: "key")**
回答by Nikunj Patel
//
//
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()
}
call Method
调用方法
let aParams : [String : String] = [ "DeviceType" : "iOS", ]
CommonMethods.saveCustomObject(aParams as AnyObject?, key:Constants.kLoginData)