我专注于开发一个处理Date
对象的应用程序。我遇到了一个与比较 2 个对象相关的问题Date
我想我已经确定了问题,但无法真正找到解决方案。
请考虑以下事项:
extension Date{
func nextDay(distance: Int = 1) -> Date {
return Calendar.current.date(byAdding: .day, value: distance, to: self)!
}
}
func generateTask(forProjects: [Project]){
for project in forProjects {
if tasks(forProject: project).isEmpty{
var startDate = Date()
var currentMilestone : Task = project.mostRecentMilestone
var indexMilestone : Int = 0
while startDate < project.lastMilestone.day!{ // Suppose last milestone differs 20 days from startDate
print("StartDate: (startDate), Current: (currentMilestone.day!)")
// Something
startDate = startDate.nextDay()
}
}
else {
print("Tasks already present")
}
}
DB.shared.save()
}
}
lastMilestone.day
由以下代码生成:
lastMilestone.day = Date().nextDay(distance: 20)
一些澄清:Project
是一个包含day: Date
属性的结构,Task
是另一个包含相同属性的对象。 假设我为每个while
周期将日期增加 1 天。预期结果将是:
StartDate: 2020-05-20 11:07:52 +0000, Current: 2020-06-09 11:07:49 +0000
StartDate: 2020-05-21 11:07:52 +0000, Current: 2020-06-09 11:07:49 +0000
StartDate: 2020-05-22 11:07:52 +0000, Current: 2020-06-09 11:07:49 +0000
...
StartDate: 2020-06-08 11:07:52 +0000, Current: 2020-06-09 11:07:49 +0000
*EXIT LOOP*
而我得到
StartDate: 2020-05-20 11:07:52 +0000, Current: 2020-06-09 11:07:49 +0000
StartDate: 2020-05-21 11:07:52 +0000, Current: 2020-06-09 11:07:49 +0000
*EXIT LOOP*
这意味着第二次比较失败。我尝试以这种方式更改代码:
//...
startDate = startDate.addingTimeInterval(3600*24)
//...
结果与以前相同。 我开始认为这与TimeZone
设置有关,或者可能是从CoreData
中包含的实体获取compareDate
的事实。 关于我的第一个想法,我看到可以手动设置Calendar.current
时区,但是当我尝试这样做时,我得到了一个read-only
错误,这对我来说似乎是合理的。 知道吗?
编辑:由于我已经验证了此代码适用于干净的项目,因此我知道我必须更具体。相应更新。
编辑 2:根据要求,这里是 日期 的值lastMilestone.day
print("StartDate: (startDate), Current: (project.lastMilestone.day!)")
OUTCOME:
StartDate: 2020-05-20 17:59:48 +0000, Current: 2020-06-09 17:59:47 +0000
仅供参考,我想为我的问题留下一个解决方案,现在我看到它无法推断。
正如我所说,这个问题与核心数据和我的模型组织有关。 具体来说,Task
实体在//Something
部分中纵,但我没有注意到核心数据模型中的特定关系会影响存储在项目中的任务的值。
更清楚的是,我的应用程序的结构如下:Task
可以是正常任务,也可以是里程碑。它们具有相同的含义,但我知道它们需要是两个独立的概念。事实上,它们都与项目有共同的关系,项目只是以里程碑为参考。然而,它们具有相同的反向关系。这可能会导致对Task
属性的操纵day
从而使答案中的while
循环无效。
解决方案是分离实体并删除反向关系。
对于我的问题准确性差,我真的很抱歉,我应该更详细地解释这个问题。