我正在制作一种基于挑战的应用程序,要求用户每天回来。如果错过了一天,他必须重新开始。
我的问题是我的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%可靠(并且可以正常工作),同时还能够检查两个日期之间的时间量?
感谢您的浏览!祝你有美好的一天
最佳答案
您可以使用下面的函数扩展Date,该函数返回从另一个日期开始的天数。
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设置为默认值作为日期,而不是将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
}
}