swift - 在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
,但感觉不太对劲。人们会推荐另一种模式吗?
解决方案
你可以使用一个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)
}
推荐阅读
- java - 如何解决 JSch 未能通过公钥身份验证而其他实用程序使用相同密钥成功的错误?
- php - JSON 数组访问 - 存储在数据库中
- json - 将 Firebase 数据快照转换为可编码的 JSON 数据
- python - Costum QSortFilterProxyModel
- git - git filter-branches 不覆盖远程分支
- python - 难以格式化 tf.example 以向 Tensorflow 服务发出请求
- python - 尝试使用 CoCalc (sage) 绘制需要模数的函数的解
- laravel - Laravel 5.7 - Spark API 身份验证会话问题
- python - 使用 RadioButtonGroup、Python Bokeh 更改网格图
- excel - 我无法将带有 html 的 woocommerce 产品描述导出到 csv