需要创建一个 userdefault 来保存 double 作为高分 (swift 3)

need to create a userdefualt that saves a double as a high score (swift3)

我希望标签 foxmill 使用用户默认值存储高分。显然,如果有新的高分,我希望将其替换。问题是 totalTime(跟踪分数的)是双精度而不是整数。所有教程都使用 int 作为高分教程。

    import UIKit
class winViewController: UIViewController {

@IBOutlet var score2: UILabel!
@IBOutlet var winningLabel: UILabel!


    @IBOutlet var foxMill: UILabel!


    @IBOutlet var hhighscore: UILabel!
    public var LebelText: String?
    public var LebelText2: String?
    public var LebelText3: String?
    public var LebelText4: String?



override func viewDidLoad() {
    super.viewDidLoad()
                timeCalculation()
     loadState()



           }
    func saveScore(score: Double) {

        // Instantiate user defaults
        let userDefaults:UserDefaults = UserDefaults.standard

        // Set your score
        userDefaults.set(score, forKey: "highScore")

        // Sync user defaults
        userDefaults.synchronize()

    }

    func loadState() {
        let userDefaults = UserDefaults.standard
        let score = userDefaults.double(forKey: "highScore")
        foxMill.text = "High Score: \(score)"
    }
            func timeCalculation(){

        guard let unwrapedText = self.LebelText2 else {
            return
        }

        guard let unwrapedText2 = self.LebelText else {
                return
        }
        guard let unwrapedText3 = self.LebelText3 else {
            return
        }
        guard let unwrapedText4 = self.LebelText4 else {
            return
        }

        if let myInt = Double(unwrapedText),  let myInt2 = Double(unwrapedText2), let myInt3 = Double(unwrapedText3), let myInt4 = Double(unwrapedText4)


        {
            var  totalTime = myInt + myInt2 + myInt3 + myInt4
            self.winningLabel.text = "You won"+"\n"+"Reaction time :" + String(totalTime) + " Seconds"
             saveScore(score: totalTime)

                }}}

您只需使用正确的密钥保存该值,然后在检索它时,确保以 Double:

的形式进行
 func saveScore(score: Double) {

     // Instantiate user defaults
     let userDefaults:UserDefaults = UserDefaults.standard

     // Set your score
     userDefaults.set(score, forKey: "highScore")

     // Sync user defaults
     userDefaults.synchronize()

}

现在,当您更新分值时,当您说 ... (unwrappedText) 时,请确保保存用户默认值

if let myInt = Double(unwrapedText),  let myInt2 = Double(unwrapedText2), let myInt3 = Double(unwrapedText3), let myInt4 = Double(unwrapedText4)

    // HERE you do whatever it was you originally did with the text, but also save a value

    saveScore(score: myInt)

{

现在,下次加载应用时,加载乐谱:

func loadScore() {
     // Instantiate User Defaults
     let userDefaults = UserDefaults.standard
     let score = userDefaults.double(forKey: "highScore")
}

当你想让 Double 而不是 Integer

时,你真的不应该命名 属性 "myInt"

如果您希望 foxMill 标签在加载时显示此高分,您需要做两件事。首先确保在应用程序关闭之前,通过同步 UserDefaults 来保存状态,查看 AppDelegate 中的 applicationDidEnterBackgroundapplicationWillTerminate 之类的方法 - 但这有点超出你的问题范围。现在,我假设您已通过调用上面列出的 saveScore(score:) 函数正确保存了上次应用程序退出时的状态。所以现在您想要检索分数并在加载时更新 foxMill 标签。你会做这样的事情:

你可以通过修改上面的 loadScore 方法来做这样的事情:

func loadScore() {
     // Instantiate User Defaults
     let userDefaults = UserDefaults.standard
     let score = userDefaults.double(forKey: "highScore")
     foxMill.text = "High Score: \(score)"
}

然后在 viewDidLoad 的结尾:

override func viewDidLoad() {
    super.viewDidLoad()

    loadScore()
}

或者您可以将方法更改为 return 一个字符串,然后将其分配给标签的文本:

func loadScore() -> String {
     // Instantiate User Defaults
     let userDefaults = UserDefaults.standard
     let score = userDefaults.double(forKey: "highScore")
     return "High Score: \(score)"
}

然后在 viewDidLoad:

override func viewDidLoad() {
    super.viewDidLoad()

    foxMill.text = loadScore()
}