2016-11-04 2 views
0

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

1

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.

+0

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

+0

@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

+0

Oui, je vais seulement lire la propriété, donc ça devrait probablement être une variable statique privée, avec un getter? – APvG