我正在学习SWIFT课程,并且我正在将我的第一个应用作为一个项目。我用一个struct数组作为数据制作图形,但我想过滤它并仅绘制用户需要查看的内容。我使用.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
条件不适合日期,但我还没有能够找到任何其他选项,以查看该变量中是否存储了任何信息。
感谢。
答案 0 :(得分:0)
我建议在单 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
}