在UserDefaults中节省时间

时间:2017-08-29 18:48:48

标签: swift date foundation userdefaults

我正在做一个小游戏。当用户进行游戏并关闭游戏时,应用程序会保存时间戳,因此当他返回时,它可以以秒为单位计算他离开的时间长度。

我的问题是,当应用程序重新打开时,它会崩溃。我可以看到这是一个转换问题,但我尝试了各种不起作用的东西。

所以我最后的希望是Stack Overflow。 : - )

我的代码如下: 在AppDelegate.swift文件中,它保存日期:

appData.set(Date(), forKey: GameData.lastTimeActiveStamp)

当用户重新打开应用程序时(仍然是AppDelegate.swift)

GameScene().calculateTimeLeft()

最后我的GameScene.swift:

let timeSinceActive = appData.object(forKey: GameData.lastTimeActiveStamp)!
/* Check the difference */
let elapsedTime = Date().timeIntervalSince(timeSinceActive as! Date)
/* Convert this to seconds */
let timeSpentAwayInSeconds = Int(elapsedTime)
/* Find out how many seconds the user had left when he quitted the game */
let currentTimeLeft = appData.integer(forKey: GameData.currentTimeLeft)
/* If the time spent away is larger than the seconds there was left, the game is over */
if timeSpentAwayInSeconds > currentTimeLeft {
    /* Game over */
    appData.set(0, forKey: GameData.currentTimeLeft)

    GameOver()
}

修改

忘记粘贴日志:

Could not cast value of type '__NSCFData' (0x1b8c90f30) to 'NSDate' (0x1b8c91b10).
2017-08-29 20:16:49.533396+0200 Sleepy[929:226885] Could not cast value of type '__NSCFData' (0x1b8c90f30) to 'NSDate' (0x1b8c91b10).

2 个答案:

答案 0 :(得分:8)

此代码对我有用:

let app = UserDefaults.standard
let date = Date()
app.set(date, forKey: "date")

if let date2 = app.object(forKey: "date") as? Date {
  Date().timeIntervalSince(date2)
}

而不是强行展开变量,而是使用更多功能,例如if letguard let等。这样可以避免在投射失败时使应用程序崩溃

答案 1 :(得分:-1)

我不建议将Date()保存为UserDefaults中的值,我会尝试更容易地像字符串或整数一样来回序列化。

尝试更换:

appData.set(Date(), forKey: GameData.lastTimeActiveStamp)

appData.set(Date().timeIntervalSince1970, forKey: GameData.lastTimeActiveStamp)