2017-08-01 80 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