Je fais un jeu dans Swift 3, et je me demandais ce qui serait la meilleure pratique pour paresseux cache un SKTexture à l'intérieur d'une énumération (ou struct). Ce que je veux est de créer une SKTexture seulement une fois, et seulement quand il est requis. Je pourrais créer un Singleton, avec un var (Dictionary/Set/Cache/...) et ajouter un nouveau SKTexture à cette variable, si une clé n'existe pas déjà ou retourner la valeur si elle existe, mais j'ai le sentiment que cela devrait être possible avec une énumération aussi bien.Swift 3 mise en cache paresseuse avec enums
Répondre
Pour le cas d'un struct
, vous pouvez simplement utiliser une lazy
propriété de votre SKTexture
:
struct Foo {
lazy var myTexture: SKTexture = {
/* some logic to construct texture only
ever (at most) once _per Foo instance_ */
return someInitializedSKTextureInstance
}()
/* or, as an immutable
lazy var myTexture: SKTexture = ... */
}
Pour une instance de Foo
, theFooInstance.myTexture
sera instancié au plus une fois, mais une seule fois fermeture exécutée ci-dessus.
Cependant, les énumérations ne peuvent pas utiliser les propriétés stockées, ce qui signifie que vous ne pouvez pas utiliser l'approche ci-dessus. Vous pouvez, cependant, utiliser une propriété static
dans un enum
: ce sont paresseux par défaut, et seront instanciés seulement (au maximum) une fois au premier appel à eux. La différence ici est naturellement (due à static
) que cette insémination une seule fois tiendra globalement pour le enum
_type), et pas pour les instances du enum
.
enum Foo {
case bar, baz
static var texture: SKTexture = {
/* logic to construct some texture ... */
return someInitializedSKTextureInstance
}()
}
Naturellement l'approche statique pourrait également être utilisée pour l'struct
cas.
OK, cela semble prometteur. Si je comprends bien, le premier exemple (struct Foo) va créer la même texture lorsque de nouvelles instances sont créées, et je veux éviter cela. Dans le second exemple, will/* logic pour construire une texture ... */ne s'exécute qu'une fois, quand 'texture' est référencé plusieurs fois? – APvG
@APvG exactement, si vous utilisez une propriété statique (vous pouvez même changer cela en un caractère immuable si vous le souhaitez, 'static let texture: SKTexture = ...': l'utilisation de propriétés statiques permet des paresseux immuables, ce qui n'est pas possible par exemple) il ne sera instancié que le plus souvent. La seule chose à garder à l'esprit en utilisant des statistiques est les conditions de course possibles dans les applications multithread, mais puisque vous ne voulez lire la propriété ici, je ne vois pas cela comme un problème. – dfri
Oui, je vais seulement lire la propriété, donc ça devrait probablement être une variable statique privée, avec un getter? – APvG