只是想知道为什么一个代码工作而另一个代码在从NSUserDefault检索值时没有
以下是我如何将信息保存到nsuserdefaults:
let prefs = NSUserDefaults.standardUserDefaults()
prefs.setValue(user_names, forKey: "username") //storing the username "test"
这是我检索nsuserdefaults信息的方式:
let prefs = NSUserDefaults.standardUserDefaults() //preference name
let username1 = prefs.stringForKey("username") //doesn't work
let username2: [NSString]? = NSUserDefaults.standardUserDefaults().objectForKey("username") as? [NSString] //works
print(username1) //doesn't work - "nil"
print(username2) //works - "test"
有人可以向我解释为什么username1不起作用但username2有效吗?感谢
答案 0 :(得分:2)
正常的方式是第二种方式。这就是你应该怎么做的
let myString = "Test"
var myStringArray = ["Test"]
保存
NSUserDefaults.standardUserDefaults().setObject(myString, forKey: "Key")
NSUserDefaults.standardUserDefaults().setObject(myStringArray, forKey: "Key")
以安全的方式获取值(如果没有第一次设置,objectForKey可能返回nil)
NSUserDefaults.standardUserDefaults().objectForKey("Key") as? String ?? myString
NSUserDefaults.standardUserDefaults().objectForKey("Key") as? [String] ?? myStringArray
您正在检查对象是否存在(如??),如果不存在,则使用属性中的默认值(?? ...)
答案 1 :(得分:1)
正如您在Apple documentation中看到的那样,您只能存储:
默认对象必须是属性列表,即(或 对于集合的实例组合):NSData,NSString, NSNumber,NSDate,NSArray或NSDictionary。如果你想存储任何 在其他类型的对象中,通常应将其存档以创建 NSData的实例。
因此,如果您想存储具有不同类型的对象,则必须执行此操作:
let data = NSKeyedArchiver.archivedDataWithRootObject(yourObject)
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject(data, forKey:"yourObject" )
然后,如果你想要检索它:
if let data = NSUserDefaults.standardUserDefaults().objectForKey("yourObject") as? NSData
{
let yourObject = NSKeyedUnarchiver.unarchiveObjectWithData(data) as! YourObjectType
}
希望这会对你有帮助!
答案 2 :(得分:0)
stringForKey返回一个可选项,因此你可以使用nil coalescing运算符“??”在nil:
的情况下返回一个空字符串“”让username1 = prefs.stringForKey(“username”)?? “”
答案 3 :(得分:0)