2017-08-01 97 views
-1

我正在学习在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条件不适合日期,但我无法找到任何其他选项来查看如果有任何信息存储在该变量中。

谢谢。

+0

没有错,可选的包装日期。但是显示'didUpdateGraph'实际上是如何调用的。也许日期真的是零。我们怎么知道?显示实际数据,实际代码。足以让我们重现问题。 – matt

+0

谢谢,我在self.view.removeFromSuperview()之前的日期和第一个if语句之前的另一个函数内部添加了一个打印语句,并且日期值是有效的,所以它们不是无 – Enrique

+0

您还没有证明了。事实上,你的代码正好相反。在你的代码中,'fechaInicio'和'fechaFin'_are_nil,所以你用'fecI'和'fecF'调用'didUpdateGraph'都是零。 – matt

回答

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 
} 
+0

嗨,谢谢,我尝试添加此代码,并且出现一个错误消息:二进制运算符“<=”不能应用于ViewController.MyData和Date类型的操作数,我怎样才能使用struct MyData? – Enrique

+0

对不起,我不好,我用一个简单的'Date'数组测试了闭包。我更新了答案。 – vadian

+0

令人惊叹,问题解决了,非常感谢! – Enrique