Swift 3 枚举惰性缓存

Swift 3 lazy caching with enums

我正在 Swift 3 制作游戏,我想知道在枚举(或结构)中延迟缓存 SKTexture 的最佳做法是什么。我想要的是仅创建一次,并且仅在需要时创建一个SKTexture。我可以创建一个带有 (Dictionary / Set / Cache / ...) var 的 Singleton,如果键尚不存在,则仅将新的 SKTexture 附加到此 var,或者 return 值(如果存在) ,但我觉得枚举也应该是可能的。

对于 struct 的情况,您可以简单地使用 SKTexture:

lazy 属性
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 = ... */       
}

对于Foo实例theFooInstance.myTexture最多会被实例化一次,但是上面只执行一次的闭包。

然而,枚举不能使用存储属性,这意味着您不能使用上述方法。但是,您可以在 enum 中使用 static 属性:默认情况下它们是惰性的,并且在第一次调用它们时只会(最多)实例化一次。这里的区别自然是(由于 static)这个一次性实例化将在全局范围内适用于 enum _type),而不适用于 enum 的实例。

enum Foo {
    case bar, baz
    static var texture: SKTexture = { 
        /* logic to construct some texture ... */
        return someInitializedSKTextureInstance 
    }()
}

当然,静态方法也可以用于 struct 情况。