2016-12-12 15 views
2

Я написал класс утилиты 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 
}() 

. 
. 
. 

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

+0

Почему бы вам не использовать одноэлементный класс? – Mohammadalijf

+0

@Mohammadalijf Это всегда возможность. Но мне любопытно узнать, есть ли решение для всего лишь статического материала. –

ответ

3

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

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

override class func initialize() { 
    _ = myObserver 
} 

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

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

+1

Да, я ошибся в своем первоначальном ответе, потому что, естественно, если вы используете Swift на iOS, вы должны унаследовать NSObject и иметь доступ к initialize(). У него действительно есть «магическое» чувство, если вы спросите меня, но это официально [задокументировано] (https://developer.apple.com/reference/objectivec/nsobject/1418639-initialize) и NSHipster [имеет] (http://nshipster.com/method-swizzling/) некоторые [статьи] (http://nshipster.com/method-swizzling/), это не должно быть слишком плохо. – Tony