我制作了一种基于挑战的应用,要求用户每天都回来。如果有一天他错过了,他必须重新开始。 我的问题是我的dateChanged() - 函数;第一件事是,它不起作用非常可靠,第二件事是我只是检查日期是否发生变化,因此我不知道在使用该应用程序之间是否有一两天的时间。 这是我目前的职能:
public func changeDays()
{
myFormatter.dateStyle = .short
myFormatter.locale = Locale(identifier: "de_DE")
oldDate = defaults.string(forKey: "oldDate")!
let newDate = Date()
let newDateString = myFormatter.string(from: newDate)
if newDateString == oldDate
{
NumberOfDaysInARow.text = "\(days) / 30"
}
else if newDateString != oldDate
{
days += 1
NumberOfDaysInARow.text = "\(days) / 30"
defaults.set(days, forKey: "days")
}
oldDate = newDateString
defaults.set(oldDate, forKey: "oldDate")
}
就在今天,它开始给我一个致命的错误,当我在我的iPhone上启动应用程序时,虽然没有发生在模拟器中......很奇怪。 我如何更改我的功能,使其100%可靠(和工作),同时还能检查两个日期之间的时间量?
感谢您一看!祝你有美好的一天
答案 0 :(得分:0)
如果您查看文档,您会看到Date
有一种方法,其唯一目的是确定两个日期timeIntervalSince(_:)
之间的间隔。
如果您将旧日期设置为上次使用当天晚上11:59,则只需查看间隔是否大于24小时(60秒* 60分钟* 24小时)。 / p>
您可能需要查看DateComponents
的文档,以获取有关创建使用当前日期但具有特定时间的日期的帮助。
答案 1 :(得分:0)
您可以使用下面的函数扩展日期,该函数返回另一个日期的天数。
extension Date {
// Returns the amount of days from another date
func days(from date: Date) -> Int {
return Calendar.current.dateComponents([.day], from: date, to: self).day ?? 0
}
}
不是将oldDate保存为字符串,而是将其设置为默认值为日期:
defaults.set(Date(), forKey: "oldDate")
您可以使用以下方式从默认值中获取旧日期:
let oldDate = defaults.object(forKey:"oldDate") as! Date
一旦你有了旧日期
let dateNow = Date()
let timeDifference = dateNow.days(from: oldDate!)
If timeDifference > 1 {
// older than 1 day
} else {
// Streak still alive
}
}