首页 > 解决方案 > 在swift中的子类中,init让属性引用self

问题描述

我正在快速学习并经常遇到以下问题。我将有一个带有属性的类,感觉好像它应该是一个let属性,因为它只会设置一次。我还希望这个子对象保持对其所有者的引用,这也应该是一个let属性,因为父关系不会改变。当父类子类化另一个类并且需要在运行let之前设置所有属性super.init ()但需要self对 init 的引用时,就会出现问题。

这是一个简单的例子

class NodeView: UIView {
    let _nodePlugView: NodePlugView

    init (node: Node) {
        _nodePlugView = NodePlugView (parentView: self)
        super.init ()
    }
}

当然,我可以只使用var这些_nodePlugView,但感觉不太对劲。人们会推荐另一种模式吗?

标签: swift

解决方案


你可以使用一个lazy变量。

lazy var _nodePlugView: NodePlugView = NodePlugView(parentView: self)

惰性变量在对象本身初始化后初始化。

如果您真的需要将它作为一个 let 常量,则另一种方法可能是为 NodePlugView 设置一个不接受 parentView 参数的初始化程序,并在初始化 parentView 后设置一个方法。

let _nodePlugView: NodePlugView

init (node: Node) {
    _nodePlugView = NodePlugView()
    super.init()
    _nodePlugView.setParentView(self)
}

推荐阅读