2016-04-22 12 views
-4

// Help Pleaseこのコードは動作しません。これをXcodeからフィードバックします。 致命的なエラー:Swift NSUserDefaultsが予期せずnilを見つけたときにオプション値


var savedScore = NSUserDefaults.standardUserDefaults().objectForKey("HighestScore") as! Int 

import SpriteKit 

class GameScene: SKScene { 

    var highestScore:Int = 2 
    var score = Int() 

    override func didMoveToView(view: SKView) { 
     /* Setup your scene here */ 

     //To save highest score 

     //To get the saved score 
     var savedScore = NSUserDefaults.standardUserDefaults().objectForKey("HighestScore") as! Int 

     print(savedScore) 


    } 

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     /* Called when a touch begins */ 
     score += 1 
     print("Score - \(score)") 

     if score > highestScore 
     { 
      highestScore = score 
      NSUserDefaults.standardUserDefaults().setObject(highestScore, forKey:"HighestScore") 
      NSUserDefaults.standardUserDefaults().synchronize() 
      print("Beat") 
     } 

     else { 
      print("Not Beat") 
     } 

    } 

    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { 

    } 

    override func update(currentTime: CFTimeInterval) { 
     /* Called before each frame is rendered */ 
    } 
} 
+0

ようこそ!新しい問題を含めるために質問を編集しないでください。代わりに、新しい質問を作成します。 – Matt

答えて

1

オプションの値をアンラップしながら、予期せず、それが今まで保存されます前に、userDefaults関数を呼び出しているnilを発見しました。それが存在するかどうかを確認する必要があります。まず自分で簡単にして、整数として保存するだけです。次に値があるかどうかを確認する必要があります。

NSUserDefaults.standardUserDefaults().setInteger(highestScore, forKey: "HighestScore") 

//IntegerForKey will never return nil. This will return 0 if there is no value. 
let savedScore = NSUserDefaults.standardUserDefaults().integerForKey("HighestScore") 
print(savedScore) 
+0

なぜこれが下落したのですか? – Jojodmo

+0

IntegerForKeyはゼロを返すことはありません –

+0

私はあなたのコメントを否定的にチェックしても申し訳ありませんが、あなたの助けに感謝します。私はあなたとEliyar Ezizの助けを借りて今すぐ修正しようとしています –

0

NSUserDefaults.standardUserDefaultsは辞書オブジェクトです。以前に値を設定していない値を読み取ろうとすると、nilが返されます。 HighestScoreの値がない場合、あなたはsavedScoreのデフォルト値として0を設定します、あなたは正しい値を取得する、存在する場合、キーの値が続いて

let savedScore = NSUserDefaults.standardUserDefaults.integerForKey("HighestScore") ?? 0 

を存在するかどうかを確認できます。

+0

私はあなたのコメントを否定として確認しましたが、あなたの助けに感謝します。私はあなたとrMickeyDの助けを借りて今すぐ修正しようとしています –

+0

あなたが提案したものを何もせずにエラーなしで動作させましたが、今度はアプリケーションを終了して再度開いても高い得点を保存しません –

+0

NSUserDefaults.standardUserDefaults()を試してください。setInteger(99、forKey: "HighestScore") '@AmenParham – BrikerMan

0

私はそれを昨日持っていますが、ここに乗って投稿する時間はありませんでしたが、ここでは動作するコードです。助けてくれた皆さん、ありがとうございました!スタックオーバーフローへ


class GameScene: SKScene { 

    var score = Int() 
    var highScore = Int() 

    override func didMoveToView(view: SKView) { 
     /* Setup your scene here */ 


     //IntegerForKey will never return nil. This will return 0 if there is no value. 
     highScore = NSUserDefaults.standardUserDefaults().integerForKey("HighestScore") 
     print("highScore - \(highScore)") 


    } 

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     /* Called when a touch begins */ 
     score += 1 
     print("Score - \(score)") 

     if score > highScore 
     { 
      highScore = score 
      NSUserDefaults.standardUserDefaults().setObject(highScore, forKey:"HighestScore") 
      NSUserDefaults.standardUserDefaults().synchronize() 
      print("Beat") 
     } 

     else { 
      print("Not Beat") 
     } 

    } 

    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { 

    } 

    override func update(currentTime: CFTimeInterval) { 
     /* Called before each frame is rendered */ 
    } 
} 
関連する問題