Я делаю игру в Swift 3, и мне было интересно, что было бы лучшей практикой для ленивого кэширования SKTexture внутри перечисления (или структуры). Я хочу создать SKTexture только один раз и только тогда, когда это необходимо. Я мог бы создать Singleton с помощью (Dictionary/Set/Cache/...) var и только добавить новый SKTexture к этому var, если ключ еще не существует или не возвращает значение, если оно существует, но у меня есть ощущение, что это должно быть возможно с перечислением.Swift 3 ленивое кэширование с перечислениями
0
A
ответ
1
Для случая struct
, вы могли бы просто использовать lazy
свойство вашего 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 = ... */
}
Для например из Foo
, theFooInstance.myTexture
будет инициализируется в самый раз, но когда-то только выполненное закрытие выше.
Перечисления, однако, не могут использовать хранимые свойства, а это означает, что вы не можете использовать описанный выше подход. Однако вы можете использовать свойство static
в enum
: по умолчанию они ленивы и будут созданы только (не более) один раз при первом обращении к ним. Разница здесь естественно (из-за static
), что эта однократная навязчивость будет храниться глобально для enum
_type), а не для экземпляров enum
.
enum Foo {
case bar, baz
static var texture: SKTexture = {
/* logic to construct some texture ... */
return someInitializedSKTextureInstance
}()
}
Естественно, что статический подход может быть использован также для struct
случае.
ОК, это выглядит многообещающе. Если я правильно понял, первый пример (struct Foo) создаст ту же текстуру, когда будут созданы новые экземпляры, и я хочу этого избежать. Во втором примере логика/* будет содержать некоторую текстуру ... */запускать только один раз, когда «текстура» ссылается несколько раз? – APvG
@APvG точно, если вы используете статическое свойство (вы можете даже изменить это на неизменяемое, если хотите, 'static let texture: SKTexture = ...': использование статических свойств позволяет ленивые неизменные, что невозможно, например, свойства) он будет создан только тогда, когда он будет один раз. Единственное, что нужно учитывать при использовании статики, - это возможные условия гонки в многопоточных приложениях, но поскольку вы только хотите прочитать здесь свойство, я не вижу в этом проблемы. – dfri
Да, я буду читать только свойство, поэтому он, вероятно, должен быть приватным статическим var, с геттером? – APvG