有没有办法判断是否已初始化惰性var?

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已经被设置?

Rob*_*ier 7

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模式来解决相同的基本问题。

  • 我确信如果您将自己的数据结构解压为不安全内存,就有某种方法。它会非常脆弱,但一切最终都只是字节,所以它必须在某个地方是可知的。但就“这是否可以比上面更安全、更简单地完成?” 我不相信是这样。“lazy”是一种非常简单的硬编码模式,它不会暴露其内部结构。 (2认同)

Dan*_*iel 7

使用Swift内置的惰性语义的较短版本:

struct Foo {
    lazy var bar: Int = {
        hasBar = true
        return 123
    }()
    private(set) var hasBar = false
}
Run Code Online (Sandbox Code Playgroud)

只需检查即可hasBar