Aller au contenu


Photo

Utilisation .filter et .reduce sur un CKRecord

swift cloudkit filter reduce

  • Please log in to reply
9 réponses à ce sujet

#1 mig123

mig123

    Eleveur de cacaoyers

  • Membre
  • PipPip
  • 14 messages
  • LocationChennevières sur Marne 94

Posté 09 mars 2017 - 09:44

Bonjour j'ai utilisé .filter et .reduce auparavant sur une structure (en commentaire dans le texte)

 

je veux maintenant les utiliser sur Activites qui est un CKrecord

 

merci pour votre aide

 let activitesToi = Activites.filter { ($0.object(forKey: "Qui") as! String) == "MIG"}
 print("Toi\n \(toi) \(activitesToi)") ne fonctionne pas
        
//        // on filtre les TOI
//        let postToi = posts.filter { (postStuct:postStuct) -> Bool in
//            return postStuct.nom == toi
//        }
//
//        // on totalise les TOI
//        totalToi = postToi.reduce(0, {
//            return $0 + $1.prix
//        })


#2 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 887 messages
  • LocationPlestin-les-Grèves (22)

Posté 09 mars 2017 - 10:43

Bonjour

 

Tout d'abord, quelques astuces :

 

1. S'il te plaît utiliser les balises <code> pour le code (je l'ai corrigé cette fois)

 

2. N'utilises pas les majuscules pour les noms des var/let (comme Activites)

 

3. Évites à tout prix d'utiliser le '!' sans plus de précautions

 

4. Lis les docs sur CKRecord avant de coder

    let a1 = CKRecord(recordType: "Activity")
    
    a1.setValue("MIG", forKey: "qui")
    
    a1.setValue(25.0, forKey: "prix")
    
    let a2 = CKRecord(recordType: "Activity")
    
    a2.setValue("TIG", forKey: "qui")
    
    a2.setValue(15.0, forKey: "prix")
    
    let a3 = CKRecord(recordType: "Activity")
    
    a3.setValue("MIG", forKey: "qui")
    
    a3.setValue(5.0, forKey: "prix")
    
    let activites = [a1, a2, a3]
    
    let activitesToi = activites.filter
    {
      guard let qui = $0.value(forKey: "qui") as? String else
      {
        return false
      }
      
      return qui == "MIG"
    }
    
    let toiTotal = activitesToi.reduce(0.0,
    {
      guard let prix = $1.value(forKey: "prix") as? Double else
      {
        return $0
      }
      
      return $0 + prix
    })
    
    print("Toi \(activitesToi) : \(toiTotal)")

  • mig123 aime ceci

#3 mig123

mig123

    Eleveur de cacaoyers

  • Membre
  • PipPip
  • 14 messages
  • LocationChennevières sur Marne 94

Posté 09 mars 2017 - 11:00

Je suis débutant merci de me donner les bonnes pratiques à utiliser

Encore merci pour cet example qui fonctionne naturellement !



#4 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 887 messages
  • LocationPlestin-les-Grèves (22)

Posté 09 mars 2017 - 11:03

Et s'il te plaît passer par http://forum.cocoaca...on-des-membres/ pour te presenter, afin que nous puissions savoir ton niveau de compétence  :-*



#5 mig123

mig123

    Eleveur de cacaoyers

  • Membre
  • PipPip
  • 14 messages
  • LocationChennevières sur Marne 94

Posté 10 mars 2017 - 09:56

Rebonjour

 

J'avais ensuite une répartition sur dix activités  quand j'utilisais une stucture

        //on affiche le total des activités
//        if activites.count > 0 {
//            
//            // on affiche pour chaque activté
//            for j in 0 ... 9 {
//                
//                // on affiche les activités de Toi
//                for i in 0 ... activites.count - 1 {
//                    
//                    if activites[i].nom == toi && activites[i].quoi == activite[j] {
//                        
//                        let leLabel = view.viewWithTag(j + 11) as! UILabel
//                        totalActiviteToi += activites[i].prix
//                        leLabel.text = NSString(format:"%.2f€", totalActiviteToi) as String
//                                            }
//                }
//                GtotalToi += totalActiviteToi
//
//                GTotTLabel.text = NSString(format:"%.2f€", GtotalToi) as String
//                totalActiviteToi = 0
//                
//                // on affiche les activités de Moi
//                for i in 0 ... activites.count - 1 {
//                    
//                    if activites[i].nom == moi && activites[i].quoi == activite[j] {
//                        
//                        let leLabel = view.viewWithTag(j + 21) as! UILabel
//                        totalActiviteMoi += activites[i].prix
//                        leLabel.text = NSString(format:"%.2f€", totalActiviteMoi) as String
//                    }
//                }
//                GtotalMoi += totalActiviteMoi
//                
//                GTotMLabel.text = NSString(format:"%.2f€", GtotalMoi) as String
//                totalActiviteMoi = 0
//            }
//        }
mais maintenant avec les CKRecords çà se complique
 
j'avais vu une extension qui permet d'utiliser un CkRecord comme une structure
 
//extension CKRecord {
//    struct Sub {
//        let record: CKRecord
//        
//        subscript(key: String) -> CKRecordValue? {
//            get {
//                
//                return record.object(forKey: key)
//            }
//            set {
//                record.setObject(newValue, forKey: value(forKey: key) as! String
//                )
//            }
//        }
//        
//        var sub: Sub {
//            return Sub(record: self)
//        }
//        
//        var postStructSet: Sub {
//            return sub
//        }
//    }
//}
 
mais cette extension ne passe pas en Swift 3

Modifié par Joanna Carter, 10 mars 2017 - 10:40 .
Manque de balises code


#6 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 887 messages
  • LocationPlestin-les-Grèves (22)

Posté 10 mars 2017 - 11:11

Encore une fois, tu n'as pas mis le code entre les balises code !

    guard activites.count > 0 else
    {
      return
    }
    
    var totalToi = 0.0
    
    var totalMoi = 0.0
    
    for uneActiviteDeNeuf in neufActivites
    {
      var totalActiviteToi = 0.0
      
      for activite in activites
      {
        if activite.nom == toi && activite.quoi == uneActiviteDeNeuf
        {
          if let leLabel = view.viewWithTag(j + 11) as? UILabel
          {
            totalActiviteToi += activite.prix
            
            leLabel.text = String(format:"%.2f€", totalActiviteToi)
          }
        }
      }
      
      totalToi += totalActiviteToi
      
      totalToiLabel.text = String(format:"%.2f€", totalToi)
      
      totalActiviteToi = 0
      
      var totalActiviteMoi = 0.0
      
      for activite in activites
      {
        if activite.nom == moi && activite.quoi == uneActiviteDeNeuf
        {
          if let leLabel = view.viewWithTag(j + 21) as? UILabel
          {
            totalActiviteMoi += activite.prix
            
            leLabel.text = String(format:"%.2f€", totalActiviteMoi)
          }
        }
      }
      
      totalMoi += totalActiviteMoi
      
      totalMoiLabel.text = String(format:"%.2f€", totalMoi)
      
      totalActiviteMoi = 0.0
    }
  }

J'ai refait ton code pour le simplifier mais je ne comprends pas pourquoi tu utilises les UILabels pour la liste quand tu pourrait utiliser une UITableView avec ses cellules.

 

Tu continues à utiliser les '!' sans précautions

 

Et, tu as utilisé les "magic numbers" et les tags ; arrêtes-toi !!!

 

Quant à ton "extension", c'est inutile. On a déjà un subscript que l'on ne peut pas surcharger. Qu'est-ce que tu imaginais faire ?



#7 mig123

mig123

    Eleveur de cacaoyers

  • Membre
  • PipPip
  • 14 messages
  • LocationChennevières sur Marne 94

Posté 10 mars 2017 - 11:26

Désolé je n'ai pas vu qu'il fallait mettre le code entre des balises, je le saurai pour la prochaine fois

 

 

Je veux bien mettre cela dans une UItableView, mais je ne vois pas trop comment

 

Je sais faire une custom cell en mettant les différents champs, mais je ne vois pas trop comment la remplir

 

merci encore pour ta réponse



#8 mig123

mig123

    Eleveur de cacaoyers

  • Membre
  • PipPip
  • 14 messages
  • LocationChennevières sur Marne 94

Posté 10 mars 2017 - 11:28

Je ne peux pas faire activite.nom car c'est un CKRecord



#9 mig123

mig123

    Eleveur de cacaoyers

  • Membre
  • PipPip
  • 14 messages
  • LocationChennevières sur Marne 94

Posté 10 mars 2017 - 11:45

voici à quoi cela ressemble

Fichier(s) joint(s)



#10 mig123

mig123

    Eleveur de cacaoyers

  • Membre
  • PipPip
  • 14 messages
  • LocationChennevières sur Marne 94

Posté 12 mars 2017 - 10:50

J'ai fait les modifications pour l'utilisation des CKRecords

//on affiche le total des activités
        
        if let activites = activites {
            guard (activites.count) > 0 else
            {
                return
            }
            
            // on affiche pour chaque activiteSetting
            for j in 0 ... 9 {
                
                // on affiche les activités de Toi
                for activite in activites {
                    
                    if activite.value(forKey: "Qui") as? String == toi && activite.value(forKey: "Quoi") as? String == activiteSetting[j] {
                        
                        let leLabel = view.viewWithTag(j + 11) as! UILabel
                        totalActiviteToi += activite.value(forKey: "Prix") as! Double
                        leLabel.text = NSString(format:"%.2f€", totalActiviteToi) as String
                        
                    }
                    GtotalToi += totalActiviteToi
                    
                    GTotTLabel.text = NSString(format:"%.2f€", GtotalToi) as String
                    totalActiviteToi = 0
                }
                
                
                // on affiche les activités de Moi
                for activite in activites {
                    
                    if activite.value(forKey: "Qui") as? String == moi && activite.value(forKey: "Quoi") as? String == activiteSetting[j] {
                        
                        let leLabel = view.viewWithTag(j + 21) as! UILabel
                        totalActiviteMoi += activite.value(forKey: "Prix") as! Double
                        leLabel.text = NSString(format:"%.2f€", totalActiviteMoi) as String
                        
                    }
                    GtotalMoi += totalActiviteMoi
                    
                    GTotMLabel.text = NSString(format:"%.2f€", GtotalMoi) as String
                    totalActiviteMoi = 0
                }
                
            }
        }

par contre rentrer çà une tableView j'aimerai bien

encore merci







Also tagged with one or more of these keywords: swift, cloudkit, filter, reduce

0 utilisateur(s) li(sen)t ce sujet

0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)