Как предотвратить ленивую загрузку статических переменных в Swift

Я написал служебный класс Swift, в котором я определяю несколько статических методов и частную статическую константу. Однако я хочу, чтобы эта константа загружалась немедленно после первой ссылки на класс, а не лениво. Единственное, что я могу придумать, это ссылаться на статическую константу в каждой отдельной статической функции следующим образом:

private static let myObserver: Observer = {
    let observer = Observer(actionToPerform: foo1)
    SomeOtherClass.register(observer)
    return observer
}()

static func foo1() {
    _ = myObserver
    ...
}

static func foo2() {
    _ = myObserver  
    ...
}

static func foo3() {
    _ = myObserver
    ...
}

//even more of a hassle:
static let myIntConstant: Int = {
    _ = myObserver
    return 5
} ()

.
.
.

Однако такое решение выглядит довольно некрасиво. Есть ли более чистый способ? Какой-то обратный вызов инициализации class, который я могу использовать?


person Hans Brende    schedule 12.12.2016    source источник
comment
Почему бы вам вместо этого не использовать одноэлементный класс?   -  person Mohammadalijf    schedule 12.12.2016
comment
@Mohammadalijf Это всегда возможно. Но мне любопытно узнать, есть ли решение только для статических вещей.   -  person Hans Brende    schedule 12.12.2016


Ответы (1)


Хорошо, я, кажется, нашел работоспособное решение для моего собственного вопроса.

  1. Убедитесь, что класс является подклассом NSObject.
  2. Вставьте следующий код:

override class func initialize() { 
     _ = myObserver
}

После этого статическая константа загружается сразу после ссылки на класс, как это необходимо.

Конечно, этот подход ограничен тем, что класс должен быть подклассом NSObject, что может быть невозможно для всех таких классов. Приветствуются любые другие потенциальные недостатки этого подхода!

person Hans Brende    schedule 12.12.2016
comment
Да, я был неправ в своем первоначальном ответе, потому что, естественно, если вы используете Swift на iOS, вы должны иметь возможность наследоваться от NSObject и иметь доступ к initialize(). Если вы спросите меня, в этом есть что-то вроде «волшебства», но официально это задокументированы, а NSHipster имеет некоторые статьи об этом не должно быть так уж плохо. - person Anton Strogonoff; 12.12.2016