为什么一个代码可以工作而另一个代码不能获取 NSUserDefaults?
Why will one code work but the other not with getting NSUserDefaults?
只是想知道为什么在从 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"
有人可以向我解释为什么用户名 1 不起作用但用户名 2 有效吗?谢谢
如您在 Apple documentation 中所见,您只能存储 :
A default object must be a property list, that is, an instance of (or
for collections a combination of instances of): NSData, NSString,
NSNumber, NSDate, NSArray, or NSDictionary. If you want to store any
other type of object, you should typically archive it to create an
instance of 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
}
希望对您有所帮助!
正常的方式是第二种方式。你应该这样做
let myString = "Test"
var myStringArray = ["Test"]
保存
NSUserDefaults.standardUserDefaults().setObject(myString, forKey: "Key")
NSUserDefaults.standardUserDefaults().setObject(myStringArray, forKey: "Key")
以安全的方式获取值(如果不是第一次设置,objectForKey 可能 return 为 nil)
NSUserDefaults.standardUserDefaults().objectForKey("Key") as? String ?? myString
NSUserDefaults.standardUserDefaults().objectForKey("Key") as? [String] ?? myStringArray
您正在检查对象是否存在(如?...),如果不存在,您将在 属性 (?? ...)
中使用默认值
stringForKey returns 是可选的,因此您可以使用 nil 合并运算符“??”到 return 空字符串 "" 在 nil 的情况下:
让用户名1 = prefs.stringForKey("username") ?? ""
我试过你的代码,它对我有用。您可以在图片中查看
代码:-
let user_names = "test"
let prefs = NSUserDefaults.standardUserDefaults()
prefs.setValue(user_names, forKey: "username")
let username1 = prefs.stringForKey("username")
print(username1!)
输出图像:-
只是想知道为什么在从 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"
有人可以向我解释为什么用户名 1 不起作用但用户名 2 有效吗?谢谢
如您在 Apple documentation 中所见,您只能存储 :
A default object must be a property list, that is, an instance of (or for collections a combination of instances of): NSData, NSString, NSNumber, NSDate, NSArray, or NSDictionary. If you want to store any other type of object, you should typically archive it to create an instance of 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
}
希望对您有所帮助!
正常的方式是第二种方式。你应该这样做
let myString = "Test"
var myStringArray = ["Test"]
保存
NSUserDefaults.standardUserDefaults().setObject(myString, forKey: "Key")
NSUserDefaults.standardUserDefaults().setObject(myStringArray, forKey: "Key")
以安全的方式获取值(如果不是第一次设置,objectForKey 可能 return 为 nil)
NSUserDefaults.standardUserDefaults().objectForKey("Key") as? String ?? myString
NSUserDefaults.standardUserDefaults().objectForKey("Key") as? [String] ?? myStringArray
您正在检查对象是否存在(如?...),如果不存在,您将在 属性 (?? ...)
中使用默认值stringForKey returns 是可选的,因此您可以使用 nil 合并运算符“??”到 return 空字符串 "" 在 nil 的情况下:
让用户名1 = prefs.stringForKey("username") ?? ""
我试过你的代码,它对我有用。您可以在图片中查看 代码:-
let user_names = "test"
let prefs = NSUserDefaults.standardUserDefaults()
prefs.setValue(user_names, forKey: "username")
let username1 = prefs.stringForKey("username")
print(username1!)
输出图像:-