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
情况。
我正在 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
情况。