2016-01-26 2 views
1

Dans l'application, je récupère une valeur à partir des données de base (cette valeur est une date) et la compare à une heure (au format d'une chaîne) et fait des actions en conséquence. Cependant, pour une raison quelconque, l'instruction if ne semble pas fonctionner. Quel que soit le temps, le résultat utilise toujours la valeur 1 (temps 0:00 à 5:30) pour la division (veuillez vérifier le code ci-dessous). J'ai vérifié pour voir si le chargement de données de noyau a le nom correct et oui cela devrait fonctionner. Quelqu'un a des idées?Vérification pour voir si l'heure est dans la plage

calculer func() {

 let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
     let managedContext = appDelegate.managedObjectContext 
     let fetchRequest = NSFetchRequest(entityName: "Settings") 

     do { 
      let results = try managedContext.executeFetchRequest(fetchRequest) 
      Settings = results as! [NSManagedObject] 

      for result in results as! [NSManagedObject] { 

       correctionRatio = result.valueForKey("correctionRatio") as! Int 
       target = result.valueForKey("targetbG") as! Int 
       value1 = result.valueForKey("value1") as! Int 
       value2 = result.valueForKey("value2") as! Int 
       value3 = result.valueForKey("value3") as! Int 
       value4 = result.valueForKey("value4") as! Int 
       value5 = result.valueForKey("value5") as! Int 

       if bGTextfield.text != "" && carbTextfield.text != "" { 

        current = Int(bGTextfield.text!) 
        carb = Int(carbTextfield.text!) 

        let currentTime = NSDate() 
        let timeFormatter = NSDateFormatter() 
        timeFormatter.locale = NSLocale.currentLocale() 
        timeFormatter.dateFormat = "HH:mm" 
        let time = timeFormatter.stringFromDate(currentTime) 


        if time > "00:00" && time < "5:30" { 
         food = carb/value1 
        } else if time > "5:31" && time < "11:00"{ 
         food = carb/value2 
        } else if time > "11:01" && time < "17:00"{ 
         food = carb/value3 
        } else if time > "17:01" && time < "21:30" { 
         food = carb/value4 
        } else if time > "21:31" && time < "23:59" { 
         food = carb/value5 
        } 



        if 4 ... 9 ~= Double(currentbG){ 

         doseLabel.text = String(foodInsulin) 


        } else if 9.1 ... 100 ~= Double(currentbG) { 

         bgDiff = currentbG - targetbG 
         correction = bgDiff/correctionRatio 
         total = food + correctionInsulin 

         doseLabel.text = String(total) 
        } 

    } 

grâce

+0

Merci à tous pour votre information, je vais y travailler et je reviendrai à vous bientôt –

Répondre

0

Juste une intuition, mais je ne pense pas que vous pouvez comparer les temps avec> et < opérateurs.

Time comparisons in swift

Ce poste explique comment le faire correctement.

De plus, vous stockez l'heure sous forme de chaîne plutôt que de date. Stockez-le comme une date à la place.

+0

salut, pas exactement ce que je cherche La comparaison ne m'aiderait pas car j'essaie de trouver si l'heure actuelle est dans un –

+0

Vous faites un test de comparaison dans votre instruction if Vous comparez deux chaînes avec> et

0

Vous effectuez des comparaisons de chaînes pour des valeurs intrinsèquement numériques. C'est une mauvaise idée de plusieurs façons, ce qui explique vos résultats inexacts. Vous pouvez comparer les chaînes comme ça, mais les règles ne sont pas les mêmes que pour les comparaisons numériques.

Si vous voulez comparer les temps, comparez les temps. Vous pourriez commencer par quelque chose comme:

let components = NSCalendar.currentCalendar().componentsInTimeZone(NSTimeZone.localTimeZone(), fromDate: NSDate()) 

À partir de là, components aura des propriétés numériques nommés hour et minute. Utilisez-les pour vos comparaisons.

2

Je l'ai fait quelque chose de semblable à cela dans un NSDate Extension:

private class func timeAsIntegerFromDate(date: NSDate) -> Int { 
    let currentCal = NSCalendar.currentCalendar() 
    currentCal.timeZone = NSTimeZone.localTimeZone() 
    let comps: NSDateComponents = currentCal.components([NSCalendarUnit.Hour, NSCalendarUnit.Minute], fromDate: date) 
    return comps.hour * 100 + comps.minute 
} 

private class func timeIsBetween(startDate: NSDate, endDate: NSDate) -> Bool { 
    let startTime = NSDate.timeAsIntegerFromDate(startDate) 
    let endTime = NSDate.timeAsIntegerFromDate(endDate) 
    let nowTime = NSDate.timeAsIntegerFromDate(NSDate()) 

    if startTime == endTime { return false } 

    if startTime < endTime { 
     if nowTime >= startTime { 
      if nowTime < endTime { return true } 
     } 
     return false 
    } else { 
     if nowTime >= startTime || nowTime < endTime { 
      return true 
     } 
     return false 
    } 
} 

Je suis sûr qu'il peut être nettoyé un peu et beaucoup amélioré. Ce que j'ai fait a été tournez NSDate en Int et puis vérifié qui est plus grand plus petit. Le principe de base est que cela multiplie le temps par 100 et ajoute les minutes à la fin de celui-ci et le compare.

0

Vous souhaitez stocker vos dates en tant que NSDate s'il s'agit d'une date. Ou comme Int16 si elle est minutes de la journée (minutes + 60 * hours telle que 05:30 serait 5 * 60 + 30 = 330. Une fois que vous avez fait cela, il est trivial de créer un prédicat qui correspond à ces valeurs qui vous intéressent.