0

ユーザーのハイスコアを NSUserDefaults に保存するゲームを Swift で構築していましたが、後でゲームがクラッシュし続けました。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 に答える