init 让属性在 swift 的子类中引用 self

jon*_*opf 2 swift

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

这是一个简单的例子

class NodeView: UIView {
    let _nodePlugView: NodePlugView

    init (node: Node) {
        _nodePlugView = NodePlugView (parentView: self)
        super.init ()
    }
}
Run Code Online (Sandbox Code Playgroud)

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

jak*_*ake 5

您可以使用lazy变量。

lazy var _nodePlugView: NodePlugView = NodePlugView(parentView: self)
Run Code Online (Sandbox Code Playgroud)

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

如果您确实需要将其设置为 let 常量,则另一种方法可能是为 NodePlugView 提供一个不采用parentView 参数的初始化程序,并提供一个在初始化后设置parentView 的方法。

let _nodePlugView: NodePlugView

init (node: Node) {
    _nodePlugView = NodePlugView()
    super.init()
    _nodePlugView.setParentView(self)
}
Run Code Online (Sandbox Code Playgroud)