使用数组日期过滤功能
问题描述:
我正在学习在SWIFT中编程,并且正在做我的第一个应用程序作为项目。我正在用一个结构数组作为数据做一个图形,但是我想过滤它并只绘制用户需要查看的图形。我正在使用.filter
函数,并且它可以很好地过滤包含给定Integer作为变量的元素。但在日期部分,我无法使其工作,我希望用户能够选择一个日期范围;这是代码我实际上有:使用数组日期过滤功能
struct MyData {
var gluc = Int()
var fec = Date()
var alimento = Int()
var comentarios = String()
}
var dataArrayOrdered = [MyData]()
func didUpdateGraph(alimentos: NSInteger, fecI: Date?, fecF: Date?, gluc: Bool, insul: Bool) {
var newDataArray = dataArrayOrdered
if alimentos == 6 {
newDataArray = dataArrayOrdered
} else {
newDataArray = dataArrayOrdered.filter{$0.alimento == alimentos}
}
if fecI != nil && fecF != nil {
newDataArray = newDataArray.filter{$0.fec >= fecI! && $0.fec <= fecF!}
} else {
if fecI != nil && fecF == nil {
newDataArray = newDataArray.filter{$0.fec >= fecI!}
} else {
if fecI == nil && fecF != nil {
newDataArray = newDataArray.filter{$0.fec <= fecF!}
}
}
}
setChartData(data: newDataArray)
}
当用户关闭与协议的PopUpViewController该函数的调用:
protocol ParentViewControllerDelegate2 {
func didUpdateGraph(alimentos: NSInteger, fecI: Date?, fecF: Date?, gluc: Bool, insul: Bool)
}
关闭之前的PopUpViewController中的代码是:
@IBAction func editG(_ sender: Any) {
var gluc: true
var ins: true
var fechaInicio: Date?
var fechaFin: Date?
var alimento = 6
if (alimentosText) != nil {
if alimentosText.text == "En Ayunas" {
alimento = 0
} else {
if alimentosText.text == "Despues de desayunar" {
alimento = 1
} else {
if alimentosText.text == "Antes de comer" {
alimento = 2
} else {
if alimentosText.text == "Despues de comer" {
alimento = 3
} else {
if alimentosText.text == "Antes de cenar" {
alimento = 4
} else {
if alimentosText.text == "Despues de cenar" {
alimento = 5
}
}
}
}
}
}
}
if let fI = datePickerTxt {
fechaInicio = datePicker.date
}
if let fF = datePickerTxt2 {
fechaFin = datePicker2.date
}
delegate?.didUpdateGraph(alimentos: alimento, fecI: fechaInicio, fecF: fechaFin, gluc: true, insul: true)
self.view.removeFromSuperview()
}
因此寻找在alimentos
中包含一定值的元素工作正常,但在日期部分没有任何区别;我在每种情况下添加了打印声明,甚至没有输入任何日期条件,这使我认为!= nil
条件不适合日期,但我无法找到任何其他选项来查看如果有任何信息存储在该变量中。
谢谢。
答
取而代之的是一堆if - else
块和nil
检查,我建议做一切必要的检查和比较在单filter
关闭:
newDataArray = newDataArray.filter { (data) -> Bool in
let lower = fecI != nil ? data.fec >= fecI! : true
let upper = fecF != nil ? data.fec <= fecF! : true
return lower && upper
}
没有错,可选的包装日期。但是显示'didUpdateGraph'实际上是如何调用的。也许日期真的是零。我们怎么知道?显示实际数据,实际代码。足以让我们重现问题。 – matt
谢谢,我在self.view.removeFromSuperview()之前的日期和第一个if语句之前的另一个函数内部添加了一个打印语句,并且日期值是有效的,所以它们不是无 – Enrique
您还没有证明了。事实上,你的代码正好相反。在你的代码中,'fechaInicio'和'fechaFin'_are_nil,所以你用'fecI'和'fecF'调用'didUpdateGraph'都是零。 – matt