2014-06-06 43 views
2

我試圖使用@lazy屬性按需加載屬性,但我需要將成員變量傳遞到延遲加載的實例的初始化程序中。具有初始化程序的惰性屬性

這裏的例子

class Worker 
{ 
    init(AnyObject context) { ... } 
} 

class Hive 
{ 
    let context : AnyObject 

    init(AnyObject context) 
    { 
    self.context = context 
    } 

    @lazy var worker = Worker(self.context) // This does not work 
} 

有沒有辦法注入成員變量爲懶加載的屬性?

這是我相當惱人的解決方法:

class Hive 
{ 
    // initializer and context constant elided 

    let lazy = Lazy() 

    class Lazy 
    { 
    var worker : Worker? = nil 
    var token : dispatch_once_t = 0 
    } 

    var worker : Worker 
    { 
    get 
    { 
     dispatch_once(&lazy.token) { self.lazy.worker = Worker(self.context) } 
     return lazy.worker! 
    } 
    } 
} 

請告訴我有一個更好的方式來做到這一點...

回答

3

下面的代碼編譯爲我(你的代碼一定是類型開啓Xcode的之外,因爲語法是關閉的)

class Worker 
{ 
    init(context : AnyObject) { } 
} 

class Hive 
{ 
    var context : AnyObject 

    init(context : AnyObject) 
    { 
     self.context = context 
    } 

    @lazy var worker : Worker = { 
     let instance = Worker(context: self.context) 
     return instance; 
    }() 
} 

它還作品,未經關閉:

@lazy var worker : Worker = Worker(context: self.context) 
+0

謝謝!我編輯了我的解決方案代碼以更加準確,但我更讚賞您的解決方案! – Erik

+0

@SiLo沒問題!是的,「@懶惰」應該是推薦的方式:] – Jack