Partage
  • Partager sur Facebook
  • Partager sur Twitter

MOOC Approfondissez Swift avec la POO

    Team OC 26 juin 2017 à 15:00:33

    Bonjour à tous,

    Le cours sur Approfondissez Swift avec la programmation orientée objet est disponible !

    Ce cours fait suite aux deux précédents sur Swift et le développement iOS :

    1. Introduction à iOS, plongez dans le développement mobile

    2. Apprenez les fondamentaux de Swift

    Dans ce cours, vous allez réaliser l'animation d'un bus scolaire avec le Playground ! En plus d'être incontournable dans la programmation en générale, la programmation orientée objet est centrale en iOS. Donc si vous souhaitez développer des applications iPhone, c'est une étape à ne pas manquer !

    Sur ce forum, je répondrais le plus régulièrement possible à vos questions. N'hésitez pas, il n'existe pas de questions bêtes. Si vous vous les posez, vous n'êtes vraisemblablement pas les seuls !

    Bon cours et bon courage ;) !

    A bientôt !

    • Partager sur Facebook
    • Partager sur Twitter
      27 juin 2017 à 21:07:15

      Bonjour,

      J'ai un problème avec le quizz 2 :

      Pour la question 6 :

      si j'écris

      class A {
         var x : String?
      }
      

      J'ai déclaré x sans valeur. Pourquoi la réponse "Déclarer simplement la propriété sans valeur" est-elle fausse ?

      Pour cette même question, un init sert à initialiser les propriétés. En quoi la réponse "Utiliser un initialisateur" est-elle juste puisque la question parle de "déclarer une propriété sans valeur par défaut" et non d'initialiser quoi que ce soit ? S'agit-il d'une erreur ?

      Pour la question 7 :

      
      class A {
         class func x() {}
         static func y() {}
      }
      

      dans cet exemple, xet ysont deux méthodes de classe. Pourquoi la question n'accepte qu'une seule réponse ?

      Pour la question 8 :

      J'ai une immense gêne avec les accents dans trois des réponses proposées.

      J'ai aussi un problème avec le quizz 3 :

      Pour la question 6, je ne suis pas d'accord avec la réponse as!. En effet, ça ne permet pas de vérifier quoi que ce soit puisque si le Type ne correspond pas, l'application crash. Après ça dépend du sens qu'on donne à "vérifier". On peut se dire que si ça crash c'est qu'on a vu que c'était pas le même type, mais bon... C'est pas ce que j'appelle une vérification. as!veut justement dire "pas besoin de vérifier je sais que c'est un Chien"

      -
      Edité par Geda 27 juin 2017 à 21:25:38

      • Partager sur Facebook
      • Partager sur Twitter
        Team OC 28 juin 2017 à 11:15:14

        Bonjour Geda !

        Et merci pour tes retours qui sont plutôt pertinents ! Je vois que tu as été rapide pour compléter ce cours !

        Quiz 2

        Question 6

        Par déclarer une propriété sans valeur, j'entendais écrire cela : 

        class A {
           var x: String
        }

        Ceci est faux car la classe réclame une initialisation pour x. Donc le programme va planter. L'optionnel étant déjà une des réponses. Je pensais que mon intention avec cette réponse était clair. Mais je me rends compte que ça ne l'ait pas trop.

        Ensuite concernant l'initialiseur, un initialiseur permet de ne pas donner de valeur par défaut comme ceci :

        class A {
            var x: String
            init(x: String) {
                self.x = x
            }
        }

        Pour cela, il faut utiliser un initialiseur avec paramètre. Je reconnais que cette question pouvait manquer de clarté. Je l'ai modifié. N'hésite pas à me dire si tu trouves ça plus clair.

        Question 7

        Je n'ai pas expliqué l'utilisation du mot class dans ce cours. Je n'ai parlé que de static. Donc je ne peux pas attendre des étudiants qu'ils connaissent cette réponse. Mais je reconnais que pour ceux qui connaissent déjà le langage Swift ou font des recherches en dehors, cela peut porter à confusion. Pour plus de clarté, j'ai supprimé ce choix.

        Question 8

        Swift est encodé avec le standard unicode. Cela veut dire que sans aucun danger (contrairement à des langages moins modernes), on peut utiliser les accents, les caractères spéciaux et même les emojis. Donc il n'y a plus de raison technique de ne pas utiliser les accents.

        Malgré cela, un programme doit toujours s'écrire en anglais donc cela règle la question des accents et il me semble que c'est dit dans ce cours (ou dans le précédent). C'est la raison pour laquelle le programme du bus est rédigé en anglais et les exemples sont en français pour faciliter la compréhension. Et je ne vois pas de raison de ne pas s'exprimer en bon français dans le cadre strictement pédagogique :) !

        Quizz 3

        Question 6

        Il existe 3 façons de contrôler les types : is, as? et as!. Je reconnais que je parle de contrôle des types dans ce cas plus que de vérification. J'ai donc modifié la question en remplaçant le mot "vérifier" par "contrôler". Cela te semble-t-il plus juste ?

        En tout cas, merci beaucoup pour tes retours constructifs. C'est grâce à ces retours que nous pouvons améliorer en continu la qualité des cours pour proposer les meilleurs cours possibles :) !

        Je t'invite à ne pas hésiter à le refaire si tu rencontres de nouvelles incompréhensions dans ce cours ou d'autres.

        A bientôt,

        Ambroise

        -
        Edité par AmbroiseCollon 28 juin 2017 à 11:16:36

        • Partager sur Facebook
        • Partager sur Twitter
          29 juin 2017 à 14:06:41

          Bonjour Ambroise,

          j'ai un problème dans l'exercice en ligne du chapitre 4 de la partie 2, lorsque j'écris le code suivant pour la méthode sePresenter(), il n'accepte pas la réponse :

          func sePresenter() -> String {
            return "Bonjour, je m'appelle \(prenom) \(nom)"
          }

          Alors que lorsque j'utilise ce code dans un Playground, il n'y a pas de problème. :(

          De plus, il y a une erreur dans l'exercice en ligne du chapitre 3 de la partie 3, tu demandes à réécrire la méthode sePresenter() de la classe Traducteur par "Hello, I am <prenom> <nom>" alors que dans les tests, tu compares le résultat à ""Hello, my name is <prenom> <nom>".

          P.S. : Tout de même, tes cours sur Swift sont d'une très bonne qualité et je t'en remercie ;)



          -
          Edité par SebouChu 29 juin 2017 à 16:21:48

          • Partager sur Facebook
          • Partager sur Twitter
            Team OC 30 juin 2017 à 11:48:03

            Bonjour SebouChu !

            Merci pour tes retours, j'ai testé ton code dans l'exercice du chapitre 4 de la partie 2 et je n'arrive pas à reproduire le problème. J'ai essayé plusieurs fois et ton code est validé à chaque fois. Donc je ne sais pas ce qui a causé un problème.

            En revanche, tu as raison pour l'exercice 3 de la partie 3, j'ai modifié les instructions de l'exercice pour qu'ils reflètent les tests. Bien vu !

            Merci beaucoup pour tes retours et bon courage pour la suite de ta formation ;)

            Ambroise

            • Partager sur Facebook
            • Partager sur Twitter
              26 juillet 2017 à 16:01:27

              Bonjour, 

              Je suis coincé au chapitre 3 de la partie 3, lorsque j'écris ce code cela m'affiche une erreur.

              class Developpeur: Personne {
                var ordinateur = "Mac"
               
                override func sePresenter() -> String {
                  super.sePresenter()
                  return ("et je suis développeur !")
                }
              }

              Ce code fonctionne pourtant dans le Playground.  :)

              Je dois surement louper quelque chose. Merci par avance de l'aide :)

              • Partager sur Facebook
              • Partager sur Twitter
                26 juillet 2017 à 19:47:44

                Bonjour,

                Quelle est l'erreur ?

                Tel que je le vois, sePresenter() n'existe pas dans la classe Personne. Sinon, si sePresenter() retourne un String ça ne sert à rien de faire super.sePresenter() puisque tu n'utilises nul part la valeur de retour.

                • Partager sur Facebook
                • Partager sur Twitter
                  27 juillet 2017 à 3:45:38

                  Bonjour, merci de la réponse ! 

                  J'essaie de faire l'override de la fonction sePresenter() qui ce trouve dans la classe Personne dans la classe Developpeur. La voici :

                  class Personne {
                      var prenom: String
                      var nom: String
                      var age = 0
                      var sexe: Sexe = .femme
                      
                      init(prenom: String, nom: String) {
                          self.prenom = prenom
                          self.nom = nom
                      }
                      
                      func sePresenter() -> String {
                          return ("Bonjour, je m'appelle \(prenom) \(nom)")
                      }

                  J'écrit donc ceci : 

                  class Developpeur: Personne {
                      var ordinateur = "Mac"
                      
                      override func sePresenter() -> String{
                          super.sePresenter()
                          return ("Et je suis developpeur!") }


                  Le code fonctionne dans le Playground, mais dans l'exercice sur la page internet, cela ne fonctionne pas.

                  Du coup c'est surement pas ce qu'attend Ambroise, mais je ne vois pas d'autre manieres de faire fonctionner cet override.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    27 juillet 2017 à 9:27:02

                    Comme je disais, c'est peut-être parce que tu n'utilises pas la valeur de retour de sePresenter()

                    Si tu fais 

                    let d = Developpeur(prénom: "O", nom; "K") 
                    print(d.sePresenter())
                    
                    

                    Tu auras dans la console "Et je suis developpeur!" et non "Bonjour, je m'appelle O KEt je suis developpeur!"

                    Après je dis peut-être n'importe quoi étant donné que je ne connais pas le fonctionnement interne d'Ambroise.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      27 juillet 2017 à 11:54:49

                      Effectivement, le problème vient de la première fonction sePresenter() qui fait un return. Car lorsque j'enlève le return et met un print. Cela fonctionne parfaitement dans le Playground, mais le problème vient de l'exercice de la page me disant que c'est toujours faux.

                      Voici les modifs faites: 

                      class Personne {
                          var prenom: String
                          var nom: String
                          var age = 0
                          var sexe: Sexe = .femme
                          
                          init(prenom: String, nom: String) {
                              self.prenom = prenom
                              self.nom = nom
                          }
                          
                          func sePresenter() {
                              print ("Bonjour, je m'appelle \(prenom) \(nom)")
                          }


                      Ainsi que l'appel de la fonction sePresenter() dans la classe Developpeur :

                      class Developpeur: Personne {
                          var ordinateur = "Mac"
                          
                          override func sePresenter() {
                              super.sePresenter()
                              print("Et je suis developpeur!") }
                          
                      
                      }
                      


                      Merci beaucoup du temps que tu m'accorde, je suis vraiment bloqué, et je n'aime pas passer au chapitre suivant sans que tout soit bon :p .

                      As-tu deja fait cet exercice ? 




                      -
                      Edité par RomainBarbaray1 27 juillet 2017 à 11:57:45

                      • Partager sur Facebook
                      • Partager sur Twitter
                        Team OC 27 juillet 2017 à 15:15:53

                        Bonjour Romain,

                        Il est inutile de modifier la fonction originale sePresenter. L'exercice ne porte que sur l'implémentation de cette fonction dans les sous-classes. ta première tentative n'était pas loin d'être bonne mais elle ne fonctionne pas, même dans le playground comme l'a noté Geda.

                        Quand tu fais appel à super.sePresenter(), tu fais simplement appelle à une fonction qui renvoie un string. Tu ne dois pas te laisser perturber par le fait que cette fonction est définie dans la classe mère. C'est juste une fonction qui renvoie un string. Donc si tu n'assignes pas de variable à super.sePrésenter() comme ceci (voir en dessous), ton appel ne sert à rien. Il faut utiliser la valeur de retour de ta fonction.

                        let presentation = super.sePresenter()

                        Maintenant tu as un string qui contient la présentation telle que définie dans la classe mère, tu n'as plus qu'à ajouter la fin de la phrase (en respectant scrupuleusement la casse, les espaces et la ponctuation pour que l'exercice soit validé). Et ensuite tu peux renvoyer ta phrase complète avec un return.

                        Cela devrait t'aider, si tu n'y arrives pas, envoie moi un message en privé pour que je puisse te donner la correction.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          3 août 2017 à 12:30:38

                          Bonjour Ambroise,

                          En suivant le cours avec Xcode 8 (donc Swift 4) je me suis rendu compte que les propriétés calculées sans setter semblent être considérées comme des propriétés en lecture seule.

                          // Le setter est omis, mais cette propriété reste modifiable
                          var propriétéCalculée: Type {
                              get {
                                  return quelqueChose
                              }
                          }

                          Peux-tu me confirmer ce changement ou si il y a une erreur quelque part ?

                          Merci

                          Aymeric

                          PS : ton cours est top et simple à comprendre !

                          • Partager sur Facebook
                          • Partager sur Twitter
                            9 août 2017 à 11:26:32

                            Bonjour bonjour,

                            Petite question et explication supplémentaire :)

                            Si j'ai bien compris avec les variables calculées et les variables stockée : 

                            Une variable calculée sera choisie si nous souhaitons vérifier l'intégrité des données ? 

                            Exemple : 

                            class Carré {
                               var longueur: Int {
                               get {
                                 return longueur
                                }
                               set {
                            if newValue > 0 && newValue >= longueur {
                            longueur = newValue
                            } else {
                            self.longueur = longueur
                            }

                            Ou alors, c'est dans ce cas précis qu'on doit utiliser les "méthodes" willSet et didSet ? 

                            Merci pour le cours :)

                            Alexandre

                            -
                            Edité par woushii 9 août 2017 à 11:34:34

                            • Partager sur Facebook
                            • Partager sur Twitter
                              9 août 2017 à 15:01:51

                              Salut,

                              Pour moi, ton exemple ne montre pas de propriété calculée. Tu as juste rajouté des règles pour ton set. Une propriété calculé c'est Plutot ça : 

                              struct Rectangle {
                              
                                var longueur : Int
                              
                                var largeur : Int
                              
                                var aire : Int {
                              
                                   get {
                              
                                       return longueur * largeur
                              
                                  }
                              
                                 }
                              
                              var isASquare : Bool {
                              
                              get {
                              
                                return largeur == longueur
                              
                              }
                              
                              } 
                              



                              Ainsi, si tu fais :

                              var rect = Rectangle(longueur: 3, largeur: 2)
                              
                              rectangle.aire // 6
                              
                              rectangle.isASquare // false
                              
                              rectangle.largeur = 3
                              
                              rectangle.aire // 9
                              
                              rectangle.isASquare // true
                              



                              Ici tu as deux propriétés calculées. Leurs valeurs sont "calculées" lorsque tu les utilises. 

                              -
                              Edité par Geda 9 août 2017 à 15:03:06

                              • Partager sur Facebook
                              • Partager sur Twitter
                                9 août 2017 à 16:04:01

                                Salut woushii, dans ton code, tu créer une propriété calculée (donc qui n'existe pas directement) que tu utilise elle même dans ton getter. Swift n'accepte meme pas de compiler ceci et heureusement d'ailleurs, sinon ce ferrait le meme effet qu'une fonction recursive infinie !

                                Je pense que ce que tu voulais faire par "si nous souhaitons vérifier l'intégrité des données" c'est plutot verifier que la longeur garde une valeur correct. Tu dois donc en effet utiliser didSet :

                                class Carré {
                                    
                                    var longueur: Int {
                                        didSet {
                                            if !(longueur > 0 && longueur >= oldValue) {
                                                longueur = oldValue
                                            }
                                        }
                                    }
                                    

                                PS: Vous utilisez quelle coloration de language pour colorer swift sur ce forum ?

                                -
                                Edité par giantwow 9 août 2017 à 16:10:49

                                • Partager sur Facebook
                                • Partager sur Twitter
                                Tutoriels sur GameplayKitSceneKit (iOS 3D game engine), ARKit (iOS réalité augmentée) en cours d'écriture
                                  9 août 2017 à 19:48:39

                                  Hello,

                                  Merci pour vos réponses. 

                                  @giantwow : C'est exactement ce que je voulais dire, en fait, je pensais au setter qu'on utilise en Java, qui sont utilisés pour vérifier (comme le disais mon prof : "L'intégrité des données" ) c'est à dire, être sûr qu'une valeur ne soit pas par exemple 0 ou -1. 

                                  @Geda : Ca va, tu me rassures avec ton explication, c'est bien ce que j'avais compris pour les propriétés calculées :)

                                  Pour la coloration, j'ai pris un truc au hasard, car il n'y a pas Swift dans la liste :( 

                                  Alexandre.

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    30 août 2017 à 21:17:36

                                    Hi,

                                    Merci pour vos interventions elles m'ont beaucoup aidé.

                                    Cependant je suis au niveau de l'exercice en ligne juste avant le quiz 2. L'exo est relatif au propriétés et methodes de Class. 

                                    Quelqu'un peut il m'aider? 

                                    Merci d'avance

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      31 août 2017 à 16:33:05

                                      Quelle est la question ?
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        3 septembre 2017 à 13:44:28

                                        voici mon code. Au fait pour la creation du static func creer jamesBond quand je compile ca me dit que c'est pas bon. Je trouve pas de solution
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          4 septembre 2017 à 15:03:29

                                          Mais encore ? Quelle est la question ?
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            4 septembre 2017 à 23:59:09

                                            Comment déclarer la methode de class creerjamesBond?
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              18 septembre 2017 à 16:53:06

                                              Geda mes excuses pour le retard 

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                18 septembre 2017 à 17:52:55

                                                essaye d'enlever une accolade fermante a la fin de ta classe pour voir
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Tutoriels sur GameplayKitSceneKit (iOS 3D game engine), ARKit (iOS réalité augmentée) en cours d'écriture
                                                  12 octobre 2017 à 17:36:36

                                                  Hello,

                                                  J'ai un petit soucis sur la création de la méthode de classe.

                                                  Dans le playground ca marche mais sur le site ca me traite de double zéro :p

                                                  Est ce que quelqu'un peut me dire ce qui cloche svp. Merci.

                                                  Voici une capture d'écran :

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    Team OC 16 octobre 2017 à 12:25:12

                                                    Il doit te manquer une majuscule à "james" ;). Les tests sont intraitables avec ce genre d'erreur :D ! Par ailleurs, tu n'as pas besoin d'utiliser la méthode sePrésenter dans cette méthode.

                                                    Bon courage pour la suite !

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      17 octobre 2017 à 11:19:18

                                                      Merci beaucoup pour ta réponse. Je commence aussi à comprendre que Swift ne rigole pas avec la syntaxe et les espaces;)
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        30 novembre 2017 à 16:32:19

                                                        Hello, merci beaucoup pour ce cours :) 

                                                        J'ai beau relire trois fois chaque chapitre, je ne comprends pas ce qui me manque pour initialiser mes paramètres "length" et "type" dans le projet BusSchool ... Pouvez-vous m'aider ? Ce doit être assez bête mais je ne vois pas ...

                                                        Un grand merci !

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          30 novembre 2017 à 22:10:08

                                                          Bonjour,

                                                          Je vais reprendre les bases.

                                                          init est un constructeur. ça permet de construire un objet en passant (ou non) certains paramètres. Exemple : 

                                                          class A {
                                                            var isInitialized = false
                                                            
                                                            init() {
                                                               isInitialized = true
                                                            }
                                                          }
                                                          
                                                          let a = A()
                                                          a.isInitialized // true

                                                          Donc dans ce cas, on utilise le constructeur, sans passer d'arguments, et on modifie une variable membre. Ça je pense que tu l'avais compris. Prenons toujours cette même classe et faisons : 

                                                          let a = A(true)

                                                          que va-t-il se passer ? Une erreur sera généré. Pourquoi ? Parce que le constructeur qui prend un paramètre n'existe pas. Lorsque tu fais A() il faut bien comprendre que c'est la méthode init() qui est appelé derrière. En faisant A(true) le compilateur va chercher une méthode init(_ something: Bool).

                                                          Prenons ton cas désormais. Tu as : 

                                                          class A {
                                                            init(x: Int) { }
                                                          }
                                                          
                                                          let a = A()

                                                          Qu'est ce qui se passe ? La même chose que le cas du dessus. En faisant A() la méthode init() est appelé. Mais cette méthode n'existe pas. Et c'est exactement ce qui est marqué dans la console : 

                                                          missing argument for parameter 'length' in call. Avec même une petite fleche qui pointe vers le paramètre manquant. la méthode init() de Road n'existe pas.

                                                          Bon petite digression, tu peux rendre ton constructeur plus joli comme ça : 

                                                          init(length: Int) {
                                                            for _ in 0 ..< min(length, Road.maxLength) {
                                                              sections.append(RoadSection())
                                                            }
                                                          }



                                                          Et deuxième digression pour te signaler que ton application va crasher si tu passes un nombre négatif

                                                          Du coup tu peux faire un truc rigolo comme : 

                                                          extension Int {
                                                              func borned(by a: Int, _ b: Int) -> Int {
                                                                  let ordered = [a, b].sorted()
                                                                  if self < ordered.first! {
                                                                      return ordered.first!
                                                                  } else if self > ordered.last! {
                                                                      return ordered.last!
                                                                  }
                                                                  
                                                                  return self
                                                              }
                                                          }
                                                          
                                                          class Road {
                                                            init(length: Int) {
                                                              for _ in 0 ..< length.borned(by: 0, Road.maxLength) {
                                                                sections.append(RoadSection())
                                                              }
                                                            }
                                                          }



                                                          -
                                                          Edité par Geda 30 novembre 2017 à 22:32:03

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter

                                                          MOOC Approfondissez Swift avec la POO

                                                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                          • Editeur
                                                          • Markdown