我尝试使用 UserDefaults 每次打开时都不会将分数重置为零,但它不起作用

I tried using UserDefaults for a score not to reset to zero every time it opens but it doesn't work

我正在尝试在我的游戏中创建应用内货币系统。为此,我尝试使用 UserDefaults,以便每次关闭应用程序并重新打开或切换到不同的 viewController 并切换回来时,所述货币不会重置为零。但是,它似乎不起作用。有人可以告诉我我做错了什么吗?

这是我的代码:

var notesScore = 0

@IBAction func IncreaseNotes(_ sender: UIButton)
{
    notesScore = notesScore + 1
    notesLabel.text = String(notesScore)
}

override func viewDidLoad()
{
    super.viewDidLoad()

    view.backgroundColor = colors.themeBlue
    notesLabel.textColor = colors.white

    var notesScoreDefault = UserDefaults.standard

    if (notesScoreDefault.value(forKey: "notesScore")  != nil)
    {
        notesScore = notesScoreDefault.value(forKey: "notesScore") as! NSInteger
        notesLabel.text = NSString(format: "Notes: %i", notesScore) as String
    }

你应该在更改时存储分数。例如,当你增加分数时,你可以将其存储到 userdefaults.

@IBAction func IncreaseNotes(_ sender: UIButton) {
    notesScore = notesScore + 1
    notesLabel.text = String(notesScore)
    // Saving score.
    UserDefaults.standard.set(self.notesScore, forKey: "notesScore")
}

现在 viewDidLoad,您可以按如下方式检索该分数,

let score = UserDefaults.standard.integer(forKey: "notesScore")
notesLabel.text = String(score)

所以我通常建议你写一个 UserdefaultsHelper.swift class 来存储你所有的用户默认值并且可以跟踪。

它应该看起来像这样:

import UIKit
import Foundation

class UserDefaultsHelper {

    static var notesScore: Int? {
        get {
            return UserDefaults.standard.object(forKey: "notesScore") as? Int
        }
        set {
            UserDefaults.standard.set(newValue, forKey: "notesScore")
        }
    }
}

之后,您可以在应用程序的任何位置通过调用访问该值:

UserDefaultsHelper.notesScore

这是一个可选的,所以下次你需要它时甚至不确定它是否存在你可以调用 viewDidLoad for exmaple:

override func viewDidLoad() {
    super.viewDidLoad()
    if let notesScore = UserDefaultsHelper.notesScore {
        // Do what you want with it here
    }
}

然后添加一些东西或者做你想做的。例如,我像这样存储 userIDs 或 pushTokens。对于未来的 Userdefaults,您可以将其添加到 UserdefaultsHelper.swift

Edit: Example

关于评论中的问题。如果你想增加 5。你可以这样做:

if let existingNotesScore = UserDefaultsHelper.notesScore {
    UserDefaultsHelper.notesScore = existingNotesScore + 5
}

说明:使用 "if let" 您可以安全地检查变量 notesScore 中的 Userdefaults 中是否保存了某些内容,如果是,它会进入 {} 并且您可以访问 existingNotesScore 中的值。然后你只需用现有的 1 + 5

覆盖 Userdefaults 中的值