我正在制作一种基于挑战的应用程序,要求用户每天回来。如果错过了一天,他必须重新开始。
我的问题是我的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
  }
}

10-07 19:43
查看更多