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

时间:2016-11-28 15:39:29

标签: swift lazy-loading lazy-initialization

我不想初始化一个视图控制器,直到我需要显示它的视图。所以我把它放在一个懒惰的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 已经已设置,我有什么方法可以测试?

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:5)

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

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

只需检查hasBar

答案 2 :(得分: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
        }
    }
}