2016-11-28 71 views
1

我不想,直到我需要顯示其視圖初始化一個視圖控制器,所以我把它在一個慵懶的變種,如:。有沒有辦法判斷一個懶惰的var是否已經被初始化?

lazy var foo: NSViewController! = { 
    let foo = NSViewController() 
    foo.representedObject = self.representedObject 
    return foo 
}() 

// ... 

override var representedObject: Any? { 
    didSet { 
     if foo != nil { 
      foo.representedObject = representedObject 
     } 
    } 
} 

self.representedObjectfoo之前設置的要求不斷被引用,但每次我叫if foo != nil,它初始化foo:C

有什麼辦法,我可以測試是否foo已經是否已確定?

回答

4

lazy只是圍繞一個特定的懶惰實例化模式(以及僅適度有用的模式)的便利包裝。如果你想要自己的模式,不要使用懶惰;只需自己構建它。

private var _foo: NSViewController? = nil 
var foo: NSViewController { 
    if let foo = _foo { 
     return foo 
    } 

    let foo = NSViewController() 
    foo.representedObject = self.representedObject 
    _foo = foo 
    return foo 
} 

// This can be private or public, as you like (or you don't technically need it) 
var isFooLoaded: Bool { 
    return _foo != nil 
} 

override var representedObject: Any? { 
    didSet { 
     if !isFooLoaded { 
      foo.representedObject = representedObject 
     } 
    } 
} 

這是爲了遵循isViewLoaded模式,既解決了同樣的基本問題。

+0

因此,無法判斷是否在之前引用了'lazy var'? –

+1

如果您將自己的數據結構解壓縮爲不安全內存,我確信有一些方法。這將是非常脆弱的,但一切最終只是字節,所以它必須在某處可以知道。但是就「這可以做到安全而且比以上更簡單嗎?」我不這麼認爲。 '懶惰'是一個非常簡單,硬編碼的模式,它不暴露它的內部。 –