在 swift 3 中保存硬币变量

saving coins variable in swift 3

我是 swift 的新手,我需要帮助来保存一个 int 变量,该变量保存用户收集的硬币并在应用程序关闭后保存它,所以这就是我所做的,我有两个场景,一个代表 startMenu,它有一个具有硬币变量的结构(所以我可以很容易地从另一个场景控制它),另一个场景是 GameScene,在 GameScene 中,每次用户与硬币节点交互时,它都会添加1 到 StarMenu 场景中的硬币变量

在我的 StartMenu 结构中

struct Variables {

    static var CoinsCollected = 0


}

这是我为了保存它所做的工作

    let defaults = UserDefaults.standard
    defaults.set(Variables.CoinsCollected, forKey: "CoinsCollected")
    defaults.synchronize()

当用户与硬币互动时,我在 GameScene 中的 didbegin 联系人中有这一行

Variables.CoinsCollected += 1

我有这一行更新硬币变量的标签节点

coinsCollectedLabel = SKLabelNode(text: "coins: \(Variables.CoinsCollected)")

一切正常,除了它没有被保存,我知道我遗漏了一些东西,我试着阅读了很多人关于同样问题的问题,但它没有用,所以如果你们中的任何一个可以帮助我,我将不胜感激

let defaults = UserDefaults.standard

...
//after Initializing Variables Instance

//get saved value
guard Variables.CoinsCollected = defaults.integer(forKey: "CoinsCollected") else {
    print("Previously saved coins don't exist")

    //create UserDefaults value for coins
    defaults.set(Variables.CoinsCollected, forKey: "CoinsCollected")
}

我认为值得保存整个 Variables 对象,这样您以后就可以获取添加到 struct 的任何新值 - 在这种情况下,您应该序列化 Variables 对象使用(例如)

//set object
defaults.set(Variables, forKey: "Variables")
//read object
let variables: Variables = defaults.object(forKey: "Variables")

//theoretically you should now be able to get CoinsCollected value within your retrieved object~
//e.g.
print(variables.CoinsCollected)

您可以在 Variables class 中执行此操作,这样您的硬币将始终保存在永久文件中:

class Variables {

    static let userDefaults = UserDefaults.standard

    struct Constants {
        static let CoinsCollectedKey = "CoinsCollected"
    }

    static var CoinsCollected: Int {
        get {
            return userDefaults.integer(forKey: self.Constants.CoinsCollectedKey)
        }

        set(value) {
            userDefaults.setValue(value, forKey: self.Constants.CoinsCollectedKey)
        }
    }
}