我无法使用 NSUserDefaults 添加分数

I can't add the score with NSUserDefaults

我正在尝试制作一个测验应用程序,我想添加最高分,但是当我点击正确答案按钮时,coinLabel 有 Matcoin = 10 文本。然后我再次点击正确答案按钮,它应该有文本 Matcoin = 20 但它有 Matcoin = 10 代替。它没有增加分数。

这是我的代码:

var coin = 0
func addCoin() {

    if soruSayisi >= 1 && soruSayisi <= 12 {
        //if the number of questions is between 1 and 12
        coin = coin + 10

    else {
        print("error")
    }

    UserDefaults.standard.set(coin, forKey: "coin")
    UserDefaults.standard.synchronize()

    coinLabel.text = NSString(format: "Matcoin =  %i", coin) as String

}
@IBAction func AbuttonClicked(_ sender: Any) {

    if "A" == cvpLbl {

        addCoin()
        //correct answer
    }


override func viewWillAppear(_ animated: Bool) {

    let coinString = String(UserDefaults.standard.integer(forKey: "coin"))
    coinLabel.text = "Matcoin = \(coinString)"
}

原因是当您调用 addCoin() 时没有从 userDefaults 中读取硬币值

func addCoin() {

    coin = UserDefaults.standard.integer(forKey: "coin")

    if soruSayisi >= 1 && soruSayisi <= 12 {

        coin = coin + 10

    else {

        print("error")
        return
    }

    UserDefaults.standard.set(coin, forKey: "coin")

    coinLabel.text = String(coin)
}
  1. viewWillAppear 中读取 UserDefaults 的值,将其分配给 coin 和标签。 别忘了打电话给super

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        coin = UserDefaults.standard.integer(forKey: "coin")
        coinLabel.text = "Matcoin = \(coin)"
    }
    
  2. addCoin()中首先检查soruSayisi是否在1..12范围内。如果是,将硬币增加 10,将其写入 UserDefaults 并更新标签。如果 coin 是最新的,则从 UserDefaults 读取的行是多余的。该代码使用模式匹配运算符 ~= 来检查范围,并使用 加法赋值运算符 += 来增加值:

    func addCoin() {
        if  1...12 ~= soruSayisi {
            coin += 10
            UserDefaults.standard.set(coin, forKey: "coin")
            coinLabel.text = "Matcoin = \(coin)"
        } else { print("error") }
    }
    

为什么不让硬币成为一个计算的属性,这样当你使用它时,它会自动获取最新值并更新标签?

var coin = 0 {
  didSet {
    coinLabel.text = "Matcoin =  \(coin)"
  }
}

func addCoin() {
    if soruSayisi >= 1 && soruSayisi <= 12 {
        //if the number of questions is between 1 and 12
        coin += 10
    }

    UserDefaults.standard.set(coin, forKey: "coin")
}

@IBAction func aButtonClicked(_ sender: UIButton) {

    if "A" == cvpLbl {

        addCoin()
        //correct answer
    }
}

override func viewWillAppear(_ animated: Bool) {
    coin = UserDefaults.standard.integer(forKey: "coin"))
}