Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Swift] afficher array

liste.append(etudiant)

Sujet résolu
    20 mars 2016 à 14:44:34

    Bonjour, 

    Au dernier TP du cours sur SWIFT

    Je ne comprend pas comment correctement récupérer l'array pourtant j'ai essayé plein de chose..  

        func ajouterEtudiant(etudiant: Etudiant)
    
        {
    
      liste.append(etudiant)
    
        }
    
        
    
        func affichePromotion()
    
        {
    
              for var i = 0; i < self.liste.count; i++ {
    
                print("L'étudiant  \(i + 1) est '\(self.liste[i])'")
    
     
    
                print(self.liste)
    
            }
    
     
    
        }



    Je voudrais lire correctement l'array mais .. 

    la sortie est :

    L'étudiant  1 est 'TPrendu.Etudiant'
    [TPrendu.Etudiant, TPrendu.Etudiant, TPrendu.Etudiant]
    L'étudiant  2 est 'TPrendu.Etudiant'
    [TPrendu.Etudiant, TPrendu.Etudiant, TPrendu.Etudiant]
    L'étudiant  3 est 'TPrendu.Etudiant'
    [TPrendu.Etudiant, TPrendu.Etudiant, TPrendu.Etudiant]
    Program ended with exit code: 0

    Idem quand je rentre 

       for (key) in self.liste {
                    print("\(key)")
                }
                
                for (value) in self.liste {
                    print("\(value)")
                }

    La sortie est encore 

    TPrendu.Etudiant
    TPrendu.Etudiant
    TPrendu.Etudiant
    TPrendu.Etudiant
    TPrendu.Etudiant
    TPrendu.Etudiant




    Je ne comprend pas pourtant j'ai bien récupéré l'entrée non ?

            liste.append(etudiant)


    donné par le main.swift


    Je devrait pouvoir accéder aux noms, prénom etc mais il ne m'affiche que TPrendu.Etudiant, est ce que son contenu est "sous entendu" ? 

    :/ 


    Merci de votre aide !

    -
    Edité par MaximeLat 21 mars 2016 à 9:43:32

    • Partager sur Facebook
    • Partager sur Twitter
      21 mars 2016 à 11:08:13

      MaximeLat a écrit:

      Bonjour Maxime,

      Le problème a de bonne chance de venir de la func ajouterEtudiant. Elle ne comprend qu’une ligne de code mais pourtant il lui manque quelque chose. Un print() pourrait aider à comprendre ce que contient la liste. La question suivante est : à qui appartient la liste ? 

      bonne recherche !

          func ajouterEtudiant(etudiant: Etudiant)
      
          {
        liste.append(etudiant)
          }
      
      


      • Partager sur Facebook
      • Partager sur Twitter
      franier
        21 mars 2016 à 18:45:40

        Merci pour votre message ! 

        Et bien j'ai définis la liste avec init comme ceci 

         init()
            {
                 self.liste = []


         après l'avoir définit par 

        class Promotion
        {
            var liste: [Etudiant] // Je suis bien en train de définir un attribut qui est un tableau de la classe Etudiant ? 

        Donc l'attribut liste appartient à la classe Etudiant et est un tableau vide initialement (j'espère que j'ai le bon vocabulaire ce sont mes début dans la POO :) )


        J'essais d'ajouter un paramètre comme ceci dans mon main 

        let etudiant1 = Etudiant(nom: "Duval", prenom: "Robert", age: 18, bourse: true, annee: 2015)
        
        promotion.ajouterEtudiant(etudiant1)
        promotion.affichePromotion()


        Je cherche ce qui cloche dans ma fonction ajouterEtudiant mais je vois pas trop, je n'ai pas besoin de passer par là : let etudiant = etudiant n'est-ce pas ? 


        Merci encore ! 



        PS : j'ai essayé self.liste.append(etudiant) 
        mais c'est le même résultat 

        et j'ai toujours une erreur avec 

        liste.appendContentsOf(etudiant)

        liste.insertContentsOf(etudiant, at: 0)

        voilà voilà.. 

        -
        Edité par MaximeLat 21 mars 2016 à 20:26:30

        • Partager sur Facebook
        • Partager sur Twitter
          22 mars 2016 à 11:10:44

          MaximeLat a écrit:

          Merci pour votre message ! 

          Et bien j'ai définis la liste avec init comme ceci 

           init()
              {
                   self.liste = []


           après l'avoir définit par 

          class Promotion
          {
              var liste: [Etudiant] // Je suis bien en train de définir un attribut qui est un tableau de la classe Etudiant ? 

          Donc l'attribut liste appartient à la classe Etudiant et est un tableau vide initialement (j'espère que j'ai le bon vocabulaire ce sont mes début dans la POO :) )

          Bonjour Maxime,

          Je vais essayer de donner des indices sans donner la réponse. Parmi les sujets, il me semble qu’on peut réfléchir à la nécessité de l’init :

          • Si ma class a une seule variable à laquelle je peux donner une valeur de départ comme 0, un String vide, ou l’équivalent pour un Array, on n'a pas besoin d’init. (voir dans le cours des tableaux, la déclaration d’un tableau vide)
          • Si je ne peux donner que le type de la (ou des) variable(s), il faut un init, d’ailleurs Xcode se charge de nous le faire savoir. (voir dans le cours sur les class comment écrire l’init avec l’exemple d’un array).

          L’exercice CombatRPG avec la class Personne est un bon exemple montrant le fonctionnement de l’init. Il faut bien comprendre ces déclarations et leur syntaxe. Dans le cas de la class Promotion on peut écrire quelque chose de très concis.

          Le problème suivant est l’écriture de la fonction Promotion.ajouterEtudiant(). La ligne de code qu’elle contient doit exprimer qu’on veut ajouter une ligne d'Etudiant à la liste de la class Promotion. Comme cette fonction est déclarée au sein de la class Promotion, comment indiquer sur cette ligne de code, l’appartenance de la liste à la class ? La solution n’est pas loin et se trouve dans l’ensemble de vos essais. Il n’y a plus qu’à tout mettre en ordre en commençant par les déclarations de la class.

          Une petite astuce de Xcode : pour comprendre ce que sont les fonctions, variables, objets de notre code il suffit de faire un Alt sur un mot jusqu’à ce qu’un point d’interrogation apparaisse puis on clic.

          Enfin une suggestion le nom de la variable liste n’est pas un problème dans une application aussi simple mais d’une façon générale, c’est beaucoup mieux de lui donner un nom plus explicite comme listeEtudiant. L’écriture du code n’est pas plus longue car il suffit de tapper quelques caractères pour que Xcode nous propose le nom de la variable que l’on a pas à tapper en entier.

          J’espère que mes explications ne sont pas trop embrouillées. Bonne suite.


          • Partager sur Facebook
          • Partager sur Twitter
          franier
            23 mars 2016 à 11:36:46

            Merci beaucoup pour ces pistes je vais revoir le l'exercieRPG et continuer mes recherches :)

             Edit : 

            franier a écrit:

            La ligne de code qu’elle contient doit exprimer qu’on veut ajouter une ligne d'Etudiant à la liste de la class Promotion. Comme cette fonction est déclarée au sein de la class Promotion, comment indiquer sur cette ligne de code, l’appartenance de la liste à la class ? 


            C'est ce que je pensais faire self.listeEtudiant pour l'appartenance à la classe Promotion puisque je définit listeEtudiant dans Promotion et j'ajoute la ligne etudiant avec append(etudiant) 

            et concernant mes essais même : 

            self.listeEtudiant.appendContentsOf(a)

            self.listeEtudiant.insertContentsOf(a, at: 0)


            ne fonctionnent pas :/ 


            Aussi j'ai comme impératif de n'avoir qu'un seul attribut : la liste d’étudiants ainsi qu'un constructeur sans paramètres qui initialisera le tableau à vide 

            Je réess"array" ce soir ;) 

            -
            Edité par MaximeLat 23 mars 2016 à 13:01:27

            • Partager sur Facebook
            • Partager sur Twitter
              23 mars 2016 à 16:04:25

              Pour illustrer ce que j’essayais d’expliquer dans mon précédent message, voici deux exemples commentés de class avec leur déclarations comparées.

              deux classes

               et leur application dans le main avec une utilisation de tableau

              main

              C’est un petit résumé de choses qui sont dans le cours. J’ai laissé volontairement une ligne qui ne peut pas fonctionner. C’est assez court pour que vous puissiez le ressaisir dans Xcode et suivre la syntaxe.

              J’ajoute qu’il faut comprendre etudiant comme un objet Etudiant et qu’il ne s’agit pas d’alimenter la listeEtudiant de chacune des propriété de l’étudiant mais bien d'ajouter l’objet etudiant lui même. Il faut  chercher quelque chose de simple.

              • Partager sur Facebook
              • Partager sur Twitter
              franier
                23 mars 2016 à 19:43:46

                Et bien merci! c'est chouette ce topo

                J'ai à présent réussis à bien définir l'array vide c'est déjà ça :) 

                Je continue ma quête pour la suite, je bug toujours sur l'ajout, je vais y arriver !

                Je pensais vraiment y arriver avec mon :

                self.listeEtudiant.appendContentsOf([etudiant])

                Mais en fait non :)

                -
                Edité par MaximeLat 23 mars 2016 à 19:48:46

                • Partager sur Facebook
                • Partager sur Twitter
                  23 mars 2016 à 22:01:05

                  Est ce que l'erreur pourrai venir du constructeur de Etudiant.swift ? 

                   init(nom: String, prenom: String, age: Int, bourse: Bool, annee: Int)
                      {
                          self.bourse = bourse
                          self.annee = annee
                          super.init(nom: nom, prenom: nom, age: age)
                  }


                  Car lorsque j'essais de donner une valeur initiale j'ai ça 

                  Je suis désolé mais je tourne en rond, j'essai des choses et quand certaines ne marche pas je reviens à mon code initiale.. j'en suis à là pour l'instant : 

                  class Promotion
                  {
                      var listeEtudiant : [Etudiant]
                  
                      
                      init()
                      {
                          self.listeEtudiant = [Etudiant]()
                      }
                      
                  
                      func ajouterEtudiant(etudiant: Etudiant)
                      {
                  
                          self.listeEtudiant.appendContentsOf([etudiant])
                      }
                      
                  
                  
                  func affichePromotion()
                  {
                      
                      print("teste \(listeEtudiant)" )
                    
                      for var i = 0; i < self.listeEtudiant.count; i++
                      {
                          print("L'étudiant  \(i + 1) est '\(self.listeEtudiant[i])'")
                          
                          for (nom) in self.listeEtudiant {
                              print("\(nom)")
                          }
                          
                          for (age) in self.listeEtudiant {
                              print("\(age)")
                          }
                          
                          
                          
                      }

                  affiche 

                  teste [TPrendu.Etudiant, TPrendu.Etudiant, TPrendu.Etudiant]

                  L'étudiant  1 est 'TPrendu.Etudiant'

                  TPrendu.Etudiant

                  TPrendu.Etudiant

                  TPrendu.Etudiant

                  TPrendu.Etudiant

                  TPrendu.Etudiant

                  TPrendu.Etudiant

                  L'étudiant  2 est 'TPrendu.Etudiant'

                  TPrendu.Etudiant

                  TPrendu.Etudiant

                  TPrendu.Etudiant

                  TPrendu.Etudiant

                  TPrendu.Etudiant

                  TPrendu.Etudiant

                  L'étudiant  3 est 'TPrendu.Etudiant'

                  TPrendu.Etudiant

                  TPrendu.Etudiant

                  TPrendu.Etudiant

                  TPrendu.Etudiant

                  TPrendu.Etudiant

                  TPrendu.Etudiant

                  Program ended with exit code: 0



                  -
                  Edité par MaximeLat 24 mars 2016 à 12:28:07

                  • Partager sur Facebook
                  • Partager sur Twitter
                    24 mars 2016 à 15:58:03

                    Bonjour Maxime,

                    Les choses s’éclaircissent, le succès n’est pas loin. il faut encore comprendre quelques petites choses :

                    • l’init de Etudiant est parfait.
                    • la création d’un nouvel étudiant se fait grace aux lignes données par Spader dans le main : let etudiant1 = Etudiant(nom: "Durand", prenom: "Jacques", age: 18, bourse: true, annee: 2015) rien de plus à écrire. Ici c’est l’init de Etudiant qui est mis en oeuvre.
                    • La tentative : self.listeEtudiant = [Etudiant](nom: … ne signifie pas grand chose
                    • Dans la classe Promotion tout démarre bien avec la déclaration d’un array de type Etudiant (var listeEtudiant: [Etudiant])
                    • l’init va très bien car il exprime que le tableau listeEtudiant est vide

                    La function ajouterEtudiant est le coeur de votre problème. Vous semblez penser que d’une façon ou d’une autre il faut injecter dans la liste chacune des propriétés qui constituent un etudiant. Or ce n’est pas le cas. Un etudiant est un objet de type Etudiant qui possède en lui même chacune de ses propriétés. Pour constituer la listeEtudiant, suffit de lui ajouter une instance etudiant.

                    Le appendContentsOf me semble expliquer le renvoi de TPrendu.Etudiant. Il faut revoir comment on ajoute un élément à un tableau. Ensuite, il faut bien regarder ce qui est entre parenthèse dans cette ligne de code. Vous n’allez pas ajouter un tableau d’etudiant ([Etudiant]) mais un etudiant, (c’est le paramètre de la fonction qui est une instance d’Etudiant).

                    La fonction affichePromotion ne doit pas elle nom plus chercher chaque propriété de chaque étudiant pour l’afficher. Elle va utiliser la function affiche de la classe Etudiant qui sait parfaitement comment afficher chaque propriété par etudiant. La fonction affichePromotion n’a besoin que d’un for sur chaque etudiant pour faire son travail. Accessoirement, vous pouvez regarder la meilleure façon d’écrire une boucle for sur une collection donc sur un tableau. Cela n’empêche pas votre modèle de boucle de fonctionner.

                    Pardon si mon propos est un peu lourd, j’essaie de bien utiliser un vocabulaire pouvant faire comprendre les nuances de la syntaxe. Une fois l’exercice terminé vous comprendrez la puissance des class.

                    Bonne suite.

                    • Partager sur Facebook
                    • Partager sur Twitter
                    franier
                      24 mars 2016 à 19:02:59

                      Non non c'est super justement, ça me permet de mieux intégrer le vocabulaire et effectivement j'avais plusieurs approximations qui m'ont couté du temps

                      En revanche, j'obtient les mêmes soucis en appliquant la méthode du cours avec 

                      self.listeEtudiant = self.listeEtudiant + [etudiant]         ou alors

                      self.listeEtudiant += [etudiant]


                      Une fois mon problème d'ajout terminé j'envisage alors ceci (qui pour l'instant me renvoie la ligne : (Fonction))

                        for var i = 0; i < self.listeEtudiant.count; i++
                          {
                          print(Etudiant.affiche(self.listeEtudiant[i]))
                          }

                       d'ailleurs il semblerais que '++' ne sera plus valable sur swift 3, par quoi remplacer alors ? i = i+1  ? 

                      ou plutôt, for value in value ? 

                      Je vais creuser l'affaire, merci beaucoup pour ces indications précieuses, je vous tiens au courant !

                      -
                      Edité par MaximeLat 24 mars 2016 à 20:34:19

                      • Partager sur Facebook
                      • Partager sur Twitter
                        25 mars 2016 à 8:32:30

                        Maxime avez-vous testé dans la class Etudiant la fonction affiche ? C’est très simple, dans le main après les 3 lignes let etudiant1= … faites  un etudiant1.affiche(). Vous comprendrez comment doit être construite affichePromotion.

                        C’est bien la boucle for in que je vous proposais d’explorer. L’esprit est for unelementDeCollection in collection{…code…}. En suite posez-vous la question du Print quand la fonction Etudiant.affiche fait dejà un print.

                        Créez un nouveau document Xcode de type playground et faites des petits essais sur des bouts de code de façon à bien comprendre ce que vous faites. Dans la colonne de droite du Playground vous avez les résultats en direct sans compilation. Sauf, si vous avez des erreurs mais les essais sont faciles à modifier. Peut-être que pour un petit moment vous devriez vous astreindre à refaire les exemples du cours.

                        Bonne suite

                        -
                        Edité par franier 25 mars 2016 à 8:36:05

                        • Partager sur Facebook
                        • Partager sur Twitter
                        franier
                          25 mars 2016 à 9:37:33

                          J'ai réussis !! merci pour votre patience, j'ai finis par comprendre que ce n'était pas la liste que je devais afficher mais bien chaque objet de celle ci :) 

                          J'étais long à la détente .. 

                          ouf.. super ! 

                          • Partager sur Facebook
                          • Partager sur Twitter
                            25 mars 2016 à 10:37:24

                            Super ! Ce temps d’hésitation vous a permis d’apprendre des choses que vous n’oublierez plus. Ça nous arrive à tous de rester plantés durant des heures sur des choses qui nous paraissent simples ensuite.

                            Bonnes aventures avec Swift.

                            • Partager sur Facebook
                            • Partager sur Twitter
                            franier
                              25 mars 2016 à 11:03:06

                              Exactement, et c'est bien que j'ai pu réfléchir sans avoir la réponse toute "pondue" 

                              Merci bonne continuation à vous !

                              • Partager sur Facebook
                              • Partager sur Twitter

                              [Swift] afficher array

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown