Swift : lazy

Par compte je ne capte pas vraiment le type lazy ?

Ce n'est pas un type, plutôt une annotation, qui dit que l'instanciation se fait de façon paresseuse: la propriété n'est pas instanciée tant qu'on n'y accède pas, et elle ne sera instanciée qu'une fois.

Voici deux exemples:


lazy var numberFormatter = NumberFormatter()

lazy var dateFormatter = {
let formatter = DateFormatter
formatter.dateStyle = .short
return formatter
}()

Réponses

  • Ok, ok, précisément ça a l'avantage d'être clair, j'avais dans l'idée truc comme ça. merci...


    L'intérêt est d'éviter l'intantiation inutile ?


  • CéroceCéroce Membre, Modérateur
    décembre 2017 modifié #3

    Oui, ça améliore les performances, mais on s'en sert aussi pour d'autres raisons.

    Améliorer la lisibilité

     



    lazy var storyboard = UIStoryboard(name: "Inventory", bundle: nil)

    ça permet d'avoir le nom du storyboard qui apparait à  un seul endroit.

    Régler des problèmes à  l'init


    En Swift, il n'est pas autorisé d'appeler une méthode de self tant que toutes les propriétés ne sont pas initialisées. Parfois, ça pose un vrai problème, et lazy peut être une solution, puisque la propriété étant lazy, il lui est permis de s'initialiser plus tard.

     



    lazy var countryPickerView: UIPickerView = {
    let view = UIPickerView(frame: CGRect.zero)
    view.dataSource = self
    view.delegate = self
    return view
    }()

    On ne pourrait pas se mettre en dataSource ou en delegate dans init() avant d'avoir initialisé toutes les propriétés.


  • Entièrement d'accord avec Céroce. Par extension à  ce qu'il présente, ça évite l'emploi du caractère "!" chose qui est bien entendu à  proscrire lorsque une variable n'est pas initialisée dans l'init de l'objet.


  • J'hésitait a lancer ce sujet, pensant quelque part enfoncer une porte ouverte, finalement j'ai bien fait.


     


    Notre chère Joanna dans un fil préconisait l'utilisation de lazy comme ceci.



    lazy var formateur = NumberFormatter()

    déjà  lazy let .... n'est pas accepté ?


     


    Ensuite peut-on penser que dans mon cas 'formateur' serait de temps a autres vide ? et réinitialisé a la demande ? 


  • Joanna CarterJoanna Carter Membre, Modérateur


    J'hésitait a lancer ce sujet, pensant quelque part enfoncer une porte ouverte, finalement j'ai bien fait.


     


    Notre chère Joanna dans un fil préconisait l'utilisation de lazy comme ceci.



    lazy var formateur = NumberFormatter()

    déjà  lazy let .... n'est pas accepté ?


     


    Ensuite peut-on penser que dans mon cas 'formateur' serait de temps a autres vide ? et réinitialisé a la demande ? 




     


     


    Non. les lets doivent être initialisé au moment de leur déclaration, qui est avant l'init.

  • Et dans ce cas précis tu peux utiliser un let.


  • L'éditeur Xcode refuse...


     


    au fur et a mesure de cette discussion je vais pratiquer différemment ...


  • Joanna CarterJoanna Carter Membre, Modérateur


    L'éditeur Xcode refuse...




     


    ????????



  • L'éditeur Xcode refuse...




     


     


    L'intérêt du lazy est de pourvoir instancier la propriété (l'objet) à  un instant qui peut être différent du moment où est instancié son conteneur. Let n'a donc aucun intérêt lorsque il est associé à  un lazy.

  • GercofisGercofis Membre
    décembre 2017 modifié #11


    L'éditeur Xcode refuse...


     




    ???? ????




     




     


     


    Xcode refuse :


     


    lazy let machin = "machin Truc"


  • Joanna CarterJoanna Carter Membre, Modérateur

    Xcode refuse :

     

    lazy let machin = "machin Truc"




    Regardes le message de Jérémy


  • Xcode refuse :


     


    lazy let machin = "machin Truc"




     


    Oui, c'est normal pour les raisons évoquées plus haut.


     


    De plus il ne faut pas oublié que le lazy t'interdit de changer la référence de ton objet. Tu ne peux donc pas faire :

     



    lazy var machin: String = { return "machin Truc A" }()
    machin = "machin Truc B"
  • Joanna CarterJoanna Carter Membre, Modérateur
    Au contraire

    struct fred
    {
    lazy var machin: String = { return "machin Truc A" }()

    mutating func test()
    {
    machin = "machin Truc B"
    }
    }

    var f = fred()

    let s = f.machin

    f.test()

    let s1 = f.machin

  • Arf okay, je n'ai pas pensé à  la fonction avec le mot clé mutating (soit dit en passant, ce concept pour moi une hérésie mais bon).  ::)


  • Cette caractéristique m'était inconnue...


     


    J'avoue ne pas tout capter non plus, même après avoir lu en partie les précisions d'Apple.


     


    Quel peut en être l'intérêt ? et l'inconvénient ?




  • Quel peut en être l'intérêt ? et l'inconvénient ?




     


    ...


     




    L'intérêt du lazy est de pourvoir instancier la propriété (l'objet) à  un instant qui peut être différent du moment où est instancié son conteneur. Let n'a donc aucun intérêt lorsque il est associé à  un lazy.



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