Initialiseur d'objet

Bonjour,
Je suis sur la partie App 3, et je suis tombé sur ce constructeur que je ne comprends pas :

init?(fromData personnData:[String:AnyObject]) {
        guard  let sName = personnData ["name"] as? String,
            let sEmail = personnData ["email"] as? String,
            let sPhone = personnData ["phone"] as? String
            else {
            return nil
        }
        name = sName
        email = sEmail
        phone = sPhone
    }

1/ Les parametres de l’initialiseur… Comment il s’utilise lorsque je souhaite créer un objet ?
2 / L’instruction guard let... else, à quoi correspond t-elle ?
3/ Question subsidiaire : Pourquoi est-il sous la forme d’un optionnel (init?)

Encore merci pour le coup de pouce

Salut,

En espérant ne pas dire de bêtises :

1/ Swift permet de définir deux noms pour un paramètre de fonction : un externe (le premier, que tu utilises en appelant la fonction), et un interne. (que tu retrouves donc dans le bloc de la fonction elle-même

2/ Guard let permet de vérifier ton/tes optionnel(s). Dans le cas présent, si une des trois variables testées n’est pas conforme à ce qui est attendu, tu rentres dans le bloc else. Si tout va bien, tu vas directement à la suite de ce bloc et assigne donc ces variables à ton instance.

3/ Les données étant récoltées ailleurs, ici en ligne si c’est bien via Alamofire, il peut ne rien avoir à récolter lors de la tentative d’instanciation de l’objet. Je suppose que sans l’optionnel ça crash, alors que tu peux juste vouloir que le tableau soit vide s’il n’y a rien à afficher.

A prendre avec des pincettes en attendant de meilleures explications, notamment pour le dernier point.

Ju

2 « J'aime »

Salut Ju et merci pour ces informations.
Pour les points 2 et 3, j’ai compris, par contre le point 1 reste encore flou.
Je vais poursuivre le tuto pour voir comment il l’utilise…
Encore merci à toi

En fait, ta fonction qui est appelée comme ça :

init?(fromData personData:[String:AnyObject]) {

Dans ta fonction tu vas utiliser le paramètre personData pour récupérer les informations.

Par contre, quand tu vas l’appeler depuis un autre endroit, tu vas utiliser

let class = Class(fromData:data)

Par exemple.
C’est une question d’esthétique et de facilité de lecture du code.

1 « J'aime »

Salut Yann
Merci pour ce complément d’info… C’est ce que j’ai pu constaté en bidouillant un peu.
Et il est vrai que c’est beaucoup plus simple à implémenter, surtout si l’objet en question possede beaucoup de paramètre.
En tout cas merci pour votre coup de pouce

1 « J'aime »

@maxime.britto
Bonjour Maxime,
Petite question, est ce que les vidéos 1 et 2, dans la partie “App 3” ne sont pas inversées ???
Je dis ça, car tu expliques dans la vidéo 2 le constructeur qui m’a “surprit” présent dans la video 1…

1 « J'aime »

J’en profite pour rebondir sur le point N°2.

Quelle est la différence fondamentale entre if let else … et guard let else ?

La différence fondamentale tient à la durée d’existence de la variable temporaire non-optionnelle

if let else

func faireQuelqueChose(texte:String?) {
   if let aTexte = texte {
       // aTexte existe ici
   }
   // aTexte n'existe plus ici
   // ...
}

guard let else

func faireQuelqueChose(texte:String?) {
  guard let aTexte = texte 
  else return { }
  // aTexte existe dans tout le corps de la fonction
  // ...
}
2 « J'aime »

Ah oui bien vu @Draken !
Je n’avais pas pensé à la portée de la constante :slight_smile:
Merci pour l’info :wink:

Ah mince, tu as carrément raison ! Les vidéos 2 et 3 sont inversées :astonished:
Je vais corriger ça de suite !

1 « J'aime »

@mbritto j’essaie de faire preuve d’une écoute active :wink:

1 « J'aime »