2017-03-01 12 views
0

サブクラスとinitTVCクラスをしようとしたとき、私は2つのエラーを取得しています:スウィフト3:のUITableViewControllerからの初期化のUITableViewController

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 
    } 

} 

エラー:オプション(VM VM作るの周りProperty self.vm not initialized at super.init call

作品: ViewModel?)は動作しますが、可能であれば、この方法をお勧めします。

私は間違っていますか?あなたは、VM lazy

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

作ることができます

+0

.initを呼び出す前にすべてのletプロパティを初期化する必要がありますが、私の考えでは、ビューモデルはビューを知らないはずです。オブザーバーパターンを使用する必要があります。 – cescobaz

答えて

1

でこのプロパティを初期化する必要はありませんアンラップされたオプション(var vm: ViewModel!)と自己の後に初期化しますが、もっと重要なことはあなたのデザインパターンを理解することです。

ビューモデルではコントローラについて知る必要はありません。コントローラーが使用するビューを生成するために必要な情報があります。さらに、実際にビューモデルを初期化した後にView Controllerを実際に保持している場合、それらは両方とも互いに参照しており、retain cycleがあります。これらの理由から、最良の解決策は、selfをビューモデルに渡す必要性を排除することです。

0

だから、回避策、すなわちビューモデルは怠け者作る(Alesenkaのソリューションを参照)、または暗黙のうちにありますinit method

0

実際には、エラーがあったことはありません

let vm: ViewModel 

var vm: ViewModel? 

に 変更することができます。

関連する問題