web-dev-qa-db-fra.com

Membres statiques implicitement paresseux dans Swift

Je viens de remarquer que static membres de Swift structs sont implicitement lazy.

Par exemple, cela n'appellera le init qu'une seule fois:

class Baz {
    init(){
        print("initializing a Baz")
    }
}
struct Foo {
    static let bar = Baz()
}

var z = Foo.bar
z = Foo.bar

Quelle est la raison derrière cela?

Et si je veux le comportement opposé?

43
cfischer

La propriété static définit une "propriété de type", qui est instanciée une fois et une seule fois. Comme vous le constatez, cela se produit paresseusement, car les statiques se comportent comme des globales. Et comme Le Swift: Propriétés dit:

Les constantes et variables globales sont toujours calculées paresseusement, de la même manière que Propriétés stockées paresseuses . Contrairement aux propriétés stockées différées, les constantes et variables globales n'ont pas besoin d'être marquées avec le modificateur lazy.

Ce comportement implicitement paresseux est dû au fait que, comme le dit Swift Blog: Fichiers et initialisation :

il permet des initialiseurs personnalisés, le temps de démarrage en Swift évolue proprement sans initialiseurs globaux pour le ralentir, et l'ordre d'exécution est complètement prévisible.

Ils l'ont consciemment conçu de cette façon pour ne pas retarder inutilement le démarrage de l'application.

Si vous souhaitez instancier la propriété static à un moment particulier de votre application (plutôt que de la reporter à l'endroit où elle est utilisée pour la première fois), faites simplement référence à cette propriété static à ce point antérieur et l'objet sera être initialisé à ce moment. Étant donné les efforts que nous avons déployés pour réduire la latence dans le démarrage de nos applications, vous ne voudriez généralement pas que cela soit synchrone lors du lancement initial de l'application, mais vous pouvez le faire où vous le souhaitez.

81
Rob