Utilisation .filter et .reduce sur un CKRecord

mig123mig123 Membre
mars 2017 modifié dans Xcode et Developer Tools #1

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
// })
Mots clés:

Réponses

  • Joanna CarterJoanna Carter Membre, Modérateur
    mars 2017 modifié #2

    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)")
  • Je suis débutant merci de me donner les bonnes pratiques à  utiliser


    Encore merci pour cet example qui fonctionne naturellement !


  • Joanna CarterJoanna Carter Membre, Modérateur
    mars 2017 modifié #4

    Et s'il te plaà®t passer par http://forum.cocoacafe.fr/forum/17-présentation-des-membres/ pour te presenter, afin que nous puissions savoir ton niveau de compétence  :-*


  • mig123mig123 Membre
    mars 2017 modifié #5

    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

  • Joanna CarterJoanna Carter Membre, Modérateur

    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 ?

  • 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

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


  • voici à  quoi cela ressemble


  • 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


Connectez-vous ou Inscrivez-vous pour répondre.