2016-12-12 54 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

爲什麼不使用singleton類呢? – Mohammadalijf

+0

@Mohammadalijf這總是一種可能性。但我很想知道是否有靜態解決方案。 –

回答

3

好吧,我似乎找到了一個可行的解決方案來解決我自己的問題。

  1. 確保該類是NSObject的子類。
  2. 將以下代碼:

override class func initialize() { 
    _ = myObserver 
} 

這樣做後,類被引用後的靜態常數立即加載,如需要的話。

當然,這種方法受限於該類必須是NSObject的子類,這對所有這些類都是不可能的。任何其他潛在的缺點,這種方法將受到歡迎!

+1

是的,我的原始答案是錯誤的,因爲如果你在iOS上使用Swift,你必須能夠從NSObject繼承並且有權訪問initialize()。如果你問我,但是它有官方的[記錄](https://developer.apple.com/reference/objectivec/nsobject/1418639-initialize)和NSHipster [has](它有一些「magicky」的感覺http://nshipster.com/method-swizzling/)一些[文章](http://nshipster.com/method-swizzling/)就不應該太糟糕。 – Tony