对包含日期的数组使用过滤函数

时间:2017-08-01 14:26:38

标签: arrays swift struct

我正在学习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条件不适合日期,但我还没有能够找到任何其他选项,以查看该变量中是否存储了任何信息。

感谢。

1 个答案:

答案 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
 }