Swift3:初始化UITableViewController

Swift 3: Initializing UITableViewController

从 UITableViewController

Subclassing 尝试 init TVC class:

时出现两个错误
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?)的工作可行,但如果可能的话,我希望这样做。

我做错了什么?

你可以制作 vm lazy

lazy var vm: ViewModel = { 
  return ViewModel(tvc: self)
}()

所以你不必在 init method

中初始化这个 属性

有变通方法,即使视图模型惰性化(请参阅 Alesenka 的解决方案)或隐式解包可选(var vm: ViewModel!)并在自我之后初始化,但更重要的是弄清楚您的设计模式。

视图模型不需要知道它的控制器;它只有必要的信息来填充控制器使用的视图。此外,如果您在初始化视图模型后实际持有视图控制器,它们将相互引用,并且您将拥有 retain cycle。由于这些原因,最好的解决方案是消除将 self 传递给视图模型的需要。

其实你可以 变化

let vm: ViewModel

var vm: ViewModel?

错误不会显示。