2017-08-30 2 views
0

私はUserDefaultsに保存された値を新しい整数と比較しようとしていますが、それはわかりません。私は、私はそれらを比較することができますので、整数であることをdefaults.object(forKey: "HighScore")から値を変更するにはどうすればよいUserDefaultsから値のタイプを変更するにはどうすればよいですか?

func setScore() { 
    let defaults = UserDefaults.standard 
    let newScore = score 
    if defaults.object(forKey: "HighScore") != nil { 
     defaults.set(newScore, forKey: "HighScore") 
     let highScore = defaults.object(forKey: "HighScore") as! Int 
     print(highScore) 
    } else if defaults.object(forKey: "HighScore") < Int(newScore) { 
     defaults.set(newScore, forKey: "HighScore") 
     let highScore = defaults.object(forKey: "HighScore") as! Int 
     print(highScore) 
    } else { 

    } 
} 

+1

「UserDefaults」のドキュメントを見ましたか?特定の型を読み取るメソッドがあります。 – rmaddy

+0

https://stackoverflow.com/questions/29930736/making-nsuserdefault-of-type-in​​teger-in-swift – toddg

+0

'else if ...'句には 'defaults.object(forKey: "HighScore") 'はありませんので、あなたの比較はあまり意味がありません。 – Caleb

答えて

0

まず、UserDefaults.standar.integer(forKey:)を使用して、タイプIntの値を取得できます。第2に、キャストされた値を一度保存​​する必要があります。数回は取得しないでください(現在は、1回ではなく3回取得します)。

さらに、あなたのロジックに欠陥があります。検索された値がnilの場合、値を比較しようとしています。したがって、Any?Intを比較しようとしているだけではなく、nilIntを比較しようとしています。

func setScore() { 
    let defaults = UserDefaults.standard 
    let newScore = score 
    if let highScore = defaults.object(forKey: "HighScore") as? Int { 
     print(highScore) 
     if highScore < Int(newScore) { 
      defaults.set(newScore, forKey: "HighScore") 
     } 
    } 
} 

同じ機能が、(そのキーに格納された値がない場合UserDefaults.integer(forKey:)戻り0)をキャストすることなくすぐInt値を取り出します。

func setScore() { 
    let newScore = score 
    if UserDefaults.standard.integer(forKey: "HighScore") < Int(newScore) { 
      defaults.set(newScore, forKey: "HighScore") 
     } 
    } 
} 
+0

ありがとう、何らかの理由で、私は無名文が必要だと思ったが、私はしなかった。今は完璧に動作します。 –

関連する問題