Swift : lazy
Céroce
Membre, Modérateur
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.Par compte je ne capte pas vraiment le type lazy ?
Voici deux exemples:
lazy var numberFormatter = NumberFormatter()
lazy var dateFormatter = {
let formatter = DateFormatter
formatter.dateStyle = .short
return formatter
}()
Connectez-vous ou Inscrivez-vous pour répondre.
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 ?
Oui, ça améliore les performances, mais on s'en sert aussi pour d'autres raisons.
Améliorer la lisibilité
ç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.
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.
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 preÌcis tu peux utiliser un let.
L'éditeur Xcode refuse...
au fur et a mesure de cette discussion je vais pratiquer différemment ...
????????
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.
Xcode refuse :
lazy let machin = "machin Truc"
Regardes le message de Jérémy
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 :
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 ?
...