【问题标题】:Use filter function for array with dates对带有日期的数组使用过滤器功能
【发布时间】:2017-08-01 14:26:37
【问题描述】:

我正在学习在 SWIFT 中编程,并且正在将我的第一个应用程序作为一个项目来开发。我正在制作一个带有结构数组作为数据的图表,但我想过滤它并仅绘制用户需要查看的内容。我正在使用.filter 函数,它可以很好地过滤包含给定整数作为变量的元素。但是在日期部分我不能让它工作,我希望用户能够选择一个日期范围;这是我实际拥有的代码:

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

谢谢。

【问题讨论】:

  • 可选包装日期没有错。但是显示didUpdateGraph 的实际调用方式。也许日期真的 为零。我们怎么知道?显示实际数据,实际代码。足以让我们重现问题。
  • 谢谢,我在 self.view.removeFromSuperview() 之前添加了日期的打印语句,并在函数内部添加了另一个语句,在第一个 if 语句之前,日期有值,所以他们不是零
  • 你还没有证明这一点。事实上,您的代码正好相反。在您的代码中,fechaIniciofechaFin 为零,因此您使用 fecIfecF 都为 nil 调用 didUpdateGraph

标签: arrays swift struct


【解决方案1】:

我建议在一个单个 filter 闭包中进行所有必要的检查和比较,而不是一堆if - else 块和nil 检查:

 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
 }

【讨论】:

  • 嗨,谢谢,我尝试添加此代码并收到一条错误消息:二进制运算符“
  • 对不起,我的错,我用一个简单的Date 数组测试了闭包。我更新了答案。
猜你喜欢
  • 1970-01-01
  • 2018-09-30
  • 1970-01-01
  • 2018-01-07
  • 1970-01-01
  • 1970-01-01
  • 2019-08-24
  • 2017-05-26
  • 1970-01-01
相关资源
最近更新 更多