有没有办法判断是否已经初始化了懒惰变量?

问题描述 投票:5回答:2

我不想初始化一个视图控制器,直到我需要显示它的视图。所以我把它放在一个懒惰的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.representedObject在引用foo之前设置,但每次我调用if foo != nil时,它都会初始化foo:c

如果foo已经设定,我有什么方法可以测试吗?

swift lazy-loading lazy-initialization
2个回答
6
投票

lazy只是一个特定的lazy-instantiation模式的便利包装器(而且只是一个适度的实用模式)。如果你想要自己的模式,不要使用懒惰;只是自己建造它。

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模式,它解决了同样的基本问题。


7
投票

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

struct Foo {
    lazy var bar: Int = {
        hasBar = true
        return 123
    }()
    private(set) var hasBar = false
}

只需检查hasBar


0
投票

我在项目中使用的实际解决方案是使用我创建的the Lazy Containers package,其中包含一个isInitialized字段:

@Lazy
var foo: NSViewController = {
    let foo = NSViewController()
    foo.representedObject = self.representedObject
    return foo
}()

// ...

override var representedObject: Any? {
    didSet {
        if _foo.isInitialized {
            foo.representedObject = representedObject
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.