为什么一个代码可以工作而另一个代码不能获取 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!)

输出图像:-