2016-11-04 4 views
0

Я делаю игру в Swift 3, и мне было интересно, что было бы лучшей практикой для ленивого кэширования SKTexture внутри перечисления (или структуры). Я хочу создать SKTexture только один раз и только тогда, когда это необходимо. Я мог бы создать Singleton с помощью (Dictionary/Set/Cache/...) var и только добавить новый SKTexture к этому var, если ключ еще не существует или не возвращает значение, если оно существует, но у меня есть ощущение, что это должно быть возможно с перечислением.Swift 3 ленивое кэширование с перечислениями

ответ

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 случае.

+0

ОК, это выглядит многообещающе. Если я правильно понял, первый пример (struct Foo) создаст ту же текстуру, когда будут созданы новые экземпляры, и я хочу этого избежать. Во втором примере логика/* будет содержать некоторую текстуру ... */запускать только один раз, когда «текстура» ссылается несколько раз? – APvG

+0

@APvG точно, если вы используете статическое свойство (вы можете даже изменить это на неизменяемое, если хотите, 'static let texture: SKTexture = ...': использование статических свойств позволяет ленивые неизменные, что невозможно, например, свойства) он будет создан только тогда, когда он будет один раз. Единственное, что нужно учитывать при использовании статики, - это возможные условия гонки в многопоточных приложениях, но поскольку вы только хотите прочитать здесь свойство, я не вижу в этом проблемы. – dfri

+0

Да, я буду читать только свойство, поэтому он, вероятно, должен быть приватным статическим var, с геттером? – APvG