为什么一个代码可以工作,但另一个代码不能获得NSUserDefaults?

时间:2016-05-26 17:01:56

标签: ios swift 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"

有人可以向我解释为什么username1不起作用但username2有效吗?感谢

4 个答案:

答案 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)

我尝试了您的密码,它对我有用。您可以在图像中查看此内容 代码: -

let user_names = "test"
    let prefs = NSUserDefaults.standardUserDefaults()
    prefs.setValue(user_names, forKey: "username")
    let username1 = prefs.stringForKey("username")
    print(username1!)

OutPut图片: -

OutPut Image