Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème MOOC iOS

Développer une application iPhone avec le modèle MVC

Sujet résolu
    9 avril 2018 à 17:35:30

    Bonjour, dans le cours suivant d'Ambroise Collon, on nous fourni un fichier swift nommé QuestionManager.swift.

    Cependant, ce fichier contient une erreur à la ligne 57 qui est de ce type : 

    Quelqu'un aurait-il une idée de comment résoudre ce problème ?

    -
    Edité par Wump3r 9 avril 2018 à 17:37:38

    • Partager sur Facebook
    • Partager sur Twitter
      9 avril 2018 à 20:11:35

      Salut,

      J'ai regardé rapidement le cours et je pense que tu as raté quelque chose dans le chapitre précédent. Quel est le contenu de ton fichier Question.swift ?

      • Partager sur Facebook
      • Partager sur Twitter
        10 avril 2018 à 10:31:40

        Bonjour et merci de ta réponse.

        Voici le contenu de mon fichier Question.swift :

        import Foundation

        struct Question {

            var title: String

            var isCorrect: Bool = false

        }

        PS: faut-il faire une modification du fichier info.plist comme pour les fonts ?

        Cordialement,

        -
        Edité par Wump3r 10 avril 2018 à 10:34:53

        • Partager sur Facebook
        • Partager sur Twitter
          10 avril 2018 à 10:54:46

          Non inutile de toucher au fichier plist.

          Remplace var title: String

          Par

          var title = ""

          • Partager sur Facebook
          • Partager sur Twitter
            10 avril 2018 à 11:22:29

            J'ai remplacé par : var title: String = "". Mon erreur disparaît mais je ne comprends pas pourquoi..

            Ensuite, il ne trouve plus le chemin du fichier plist pour compiler (normal vu qu'il est dans un dossier nommé : Supporting Files). Mais on nous a demandé de faire ainsi dans le cours. J'avoue être un peu perdu..

            • Partager sur Facebook
            • Partager sur Twitter
              10 avril 2018 à 11:33:25

              struct Question {
               var title: String
               var isCorrect = false
              }
              
              
              let question = Question()
              
              print(question.isCorrect) // Quelle est la valeur ?
              print(question.title) // Quelle est la valeur ?
              

              Pour la première question, c'est simple. C'est false.
              Pour la deuxième, c'est plus compliqué, on a jamais donné de valeur à cette variable. Donc elle n'en a pas. Même pas nil, puisque ce n'est pas un optional.
              C'est pour cette raison que tu es obligé de passer par un init pour donner une valeur à la variable ou bien de lui donner une valeur par défaut pour qu'il n'y ai pas d'état indéterminé. Dans un autre langage, tu aurais eu un NullPointerException.
              Donc, pour résoudre le problème, il y a plusieurs méthodes et je t'ai indiqué celle que donne le cours. Pour les passer en revue :
              struct Question {
                var title = "" // Pas besoin d'indiquer le type
              }
              
              struct Question {
                var title: String? // nil par défaut
              }
              
              struct question {
                var title: String
              
                // On donne une valeur par défaut au paramètre, donc on peut l'omettre dans l'appel
                init(title: String? = nil) {
                  self.title = title ?? "" // title ne pouvant pas etre nil on donne une valeur par défaut
                 }
              
              // Compile pour chacune des implémentations de Question ci-dessus
              let question = Question()
              Pour le plist, sur Xcode, dans le panel de droite tu peux indiquer le nouveau chemin (normalement si le chemin est incorrect il est écrit en rouge)
              Tu peux aussi supprimer le fichier du projet et le ré-ajouter
              • Partager sur Facebook
              • Partager sur Twitter
                10 avril 2018 à 11:36:28

                Merci beaucoup Geda, mais du coup une dernière question subsiste.

                var title: String ne veut pas dire que la variable est initialisée mais à pour valeur un "vide" (du type : var title: String <=> var title: String = ") ?

                Bien cordialement,

                • Partager sur Facebook
                • Partager sur Twitter
                  10 avril 2018 à 11:53:41

                  Non. Ca veut juste dire que son type est String. Rien n'est induit sur sa valeur. Ca évite d'oublier d'initialiser des valeurs.

                  Si tu as ce genre de choses

                  struct Question {
                    var title: String // En supposant que la valeur par défaut soit ""
                    var isCorrect = false
                  
                    init(title: String, isCorrect: Bool) {
                       self.isCorrect = isCorrect
                    }
                  }
                  
                  let question = Question(title: "AAA", isCorrect: false)
                  print(question.title) 

                  Tu te trimbales alors avec un "" alors que tu t'attends à "AAA". C'est un cas simple, c'est pas compliqué de comprendre où ça merde. Mais ça peut être rapidement compliqué à debug.

                  Le deuxième problème, c'est que tu peux certes t'attendre à "" sur un String, mais si on prend ce cas là :

                  struct Question { 
                    var isCorrect: Bool
                  }

                  que vaut isCorrect ? pourquoi la valeur par défaut serait plus true que false ? Et inversement. On peut même étendre le problème à des types plus complexe : 

                  enum Difficulty {
                    case easy, medium, hard
                  }
                  
                  struct Question {
                    var difficulty: Difficulty
                  }

                  que vaut difficulty ?  Je pourrais étendre le problème à d'autres type, mais je pense que tu as bien cerné le problème ;)

                  EDIT : Je me rend compte que mon premier point (sur les init) est beaucoup moins pertinent. Je mélange le comportement réel et le comportement auquel tu t'attends. Ca donne quelque chose qui manque cruellement de logique.

                  -
                  Edité par Geda 10 avril 2018 à 12:13:10

                  • Partager sur Facebook
                  • Partager sur Twitter
                    10 avril 2018 à 15:25:32

                    Non non c'est bon j'ai bien compris grâce à toi ^^

                    Merci beaucoup de tes explications, c'est beaucoup plus clair pour moi maintenant :)

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Problème MOOC iOS

                    × 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