Ben*_*ero 8 lazy-loading lazy-initialization swift
我不想初始化视图控制器,直到需要显示其视图。
lazy var foo: NSViewController! = {
let foo = NSViewController()
foo.representedObject = self.representedObject
return foo
}()
// ...
override var representedObject: Any? {
didSet {
if foo != nil {
foo.representedObject = representedObject
}
}
}
Run Code Online (Sandbox Code Playgroud)
self.representedObject
是在以前foo
被引用之前设置的,但是每次调用时if foo != nil
,它都会初始化foo
:c
有没有什么办法,如果我可以测试foo
也已经被设置?
lazy
只是围绕一种特定的惰性实例化模式(以及仅适度有用的一种)的便利包装。如果您想要自己的模式,请不要使用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
}
}
}
Run Code Online (Sandbox Code Playgroud)
旨在遵循该isViewLoaded
模式来解决相同的基本问题。
使用Swift内置的惰性语义的较短版本:
struct Foo {
lazy var bar: Int = {
hasBar = true
return 123
}()
private(set) var hasBar = false
}
Run Code Online (Sandbox Code Playgroud)
只需检查即可hasBar
。
归档时间: |
|
查看次数: |
1581 次 |
最近记录: |