使用 UserDefaults 存储点击游戏的分数 (Swift 5)

Jei*_*Jei 1 xcode nsuserdefaults uikit ios swift

做了一个简单的增量游戏。我希望这样即使我转到不同的VC然后返回游戏或重新打开游戏,它也会显示当前分数。我的问题是,如果我离开游戏,那么分数将归零。我不希望这种情况发生。分数不应该被重置。我听说我可以使用 UserDefaults,但我根本不熟悉它。如果您可以使用代码进行解释,那将是最好的。谢谢。

import UIKit

class CookieClickerVC: UIViewController {

@IBOutlet weak var goldLabel: UILabel!
@IBOutlet weak var numberOfGold: UILabel!
@IBOutlet weak var getGoldButton: UIButton!

override func viewDidLoad() {
    super.viewDidLoad()
    formatItems()
    let defaults = UserDefaults.standard
    defaults.set(0, forKey: "goldCount")

}



@IBAction func getGoldClicked(_ sender: Any) {
    goldCount += 1
    numberOfGold.text = ("\(goldCount)")
}`
Run Code Online (Sandbox Code Playgroud)

此外,您可能已经想通了,但是 goldCount 是一个未解析的标识符。单击按钮后我应该如何更改代码?

Kes*_*Rai 6

第 1 步:声明您的goldCount变量并将初始值设置为0

第 2 步:在 上viewDidLoad,获取存储在 中的值UserDefaults并将其设置为goldCount

第 3 步:同时更新您的标签

第 4 步:更新goldCountin的值userDefaults

import UIKit

class CookieClickerVC: UIViewController {

    @IBOutlet weak var goldLabel: UILabel!
    @IBOutlet weak var numberOfGold: UILabel!
    @IBOutlet weak var getGoldButton: UIButton!

    //Step1: declare your goldCount variable and set initial value to 0
    var goldCount = 0

    override func viewDidLoad() {
        super.viewDidLoad()
        formatItems()
        //Step2: on viewDidLoad, get the value stored in the UserDefaults and set it to goldCount
        goldCount = UserDefaults.standard.integer(forKey: "goldCount")
        //Step3: then also update your label
        numberOfGold.text = ("\(goldCount)")


    }

    @IBAction func getGoldClicked(_ sender: Any) {
        goldCount += 1
        numberOfGold.text = ("\(goldCount)")
        //Step4: update the value of goldCount in userDefaults
        UserDefaults.standard.set(goldCount, forKey: "goldCount")
    }
}
Run Code Online (Sandbox Code Playgroud)


use*_*632 5

您可以使用这些funtions来获取和设置分数

class CookieClickerVC: UIViewController {

    @IBOutlet weak var goldLabel: UILabel!
    @IBOutlet weak var numberOfGold: UILabel!
    @IBOutlet weak var getGoldButton: UIButton!


   lazy var goldCount : Int = 0 {
         didSet {
        numberOfGold.text = ("\(goldCount)")
       }
   }

   override func viewDidLoad() {
        super.viewDidLoad()
        formatItems()
        goldCount = getScore()

    }

    @IBAction func getGoldClicked(_ sender: Any) {
        goldCount += 1
        savescore(goldCount)
    }

    //  Save and Get methods ..

    func saveScore(_ score:Int) {
            let defaults = UserDefaults.standard
            defaults.set(score, forKey: "goldCount")
          //  defaults.synchronize() its [unnecessary][1] 
        }
Run Code Online (Sandbox Code Playgroud)

// defaults.synchronize() 它是不必要的

    func getScore()-> Int {
          let defaults = UserDefaults.standard
          return  defaults.integer(forKey: "goldCount")
        }
}
Run Code Online (Sandbox Code Playgroud)