2016-11-28 70 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

如果您将自己的数据结构解压缩为不安全内存,我确信有一些方法。这将是非常脆弱的,但一切最终只是字节,所以它必须在某处可以知道。但是就“这可以做到安全而且比以上更简单吗?”我不这么认为。 '懒惰'是一个非常简单,硬编码的模式,它不暴露它的内部。 –