从UITableViewController进行子类化,我在尝试init
TVC
类时遇到两个错误:
class TVC: UITableViewController {
let vm: ViewModel
override init(style: UITableViewStyle){
super.init(style: style)
self.vm = ViewModel(tvc: self) // Error: Property `self.vm` not initialized at super.init call
}
override init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!){
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
// Error: Property `self.vm` not initialized at super.init call
}
}
错误:Property self.vm not initialized at super.init call
使vm成为可选(vm:ViewModel?)的工作原理,但如果可能的话,我想这样做。
我做错了什么?
答案 0 :(得分:1)
有一些解决方法,即使视图模型变得懒惰(参见Alesenka的解决方案)或隐式解包的可选(var vm: ViewModel!
)并在自我之后进行初始化,但更重要的是确定您的设计模式。
视图模型不需要了解其控制器;它只是具有填充视图的必要信息,控制器使用该视图。此外,如果您在初始化视图模型后实际上持有视图控制器,则它们彼此引用,并且您将拥有retain cycle。出于这些原因,最佳解决方案是消除将self
传递给视图模型的需要。
答案 1 :(得分:0)
您可以制作vm lazy
lazy var vm: ViewModel = {
return ViewModel(tvc: self)
}()
因此,您不必在init method
答案 2 :(得分:0)
实际上,你可以 变化
help()
到
let vm: ViewModel
错误将不会显示。