0

我正在用 Swift 构建一个游戏,将用户的高分存储在 NSUserDefaults 中,但是后来游戏一直崩溃。我将范围缩小到读取 NSUserDefaults 的最高分,因此我制作了一个简单的应用程序来测试使用 NSUserDefaults 保存和读取值。我使用按钮按顺序运行每个功能。这是代码:

@IBOutlet var valueTextfield: UITextField
@IBOutlet var keyTextfield: UITextField
@IBOutlet var valueLabel: UILabel

@IBAction func saveData(sender: UIButton){
    NSUserDefaults.standardUserDefaults().setObject(valueTextfield.text, forKey: keyTextfield.text)
}
@IBAction func forceSynchronise(sender: UIButton){
    NSUserDefaults.standardUserDefaults().synchronize()
}

@IBAction func refreshLabel(sender: UIButton){
    valueLabel.text = NSUserDefaults.standardUserDefaults().objectForKey(keyTextfield.text) as String
}

当最后一个函数运行时,它会抛出异常:“致命错误:无法打开 Optional.None”。我认为由于最后一行肯定会返回一个值,因此不需要选项,但显然我错了。有人可以指出我做错了什么吗?

谢谢您的帮助!

4

2 回答 2

2

利用

as? String

代替

as String 

否则你会在 nil 值上崩溃。

于 2014-06-05T16:09:26.620 回答
0

我会这样做:

if let valueText = NSUserDefaults.standardUserDefaults().objectForKey(keyTextfield.text) as? String{

    valueLabel.text = valueText
}else{
    //handle nil value
}

这不会崩溃,并且可以让您处理获得 nil 值。

于 2014-06-05T16:18:17.947 回答