2017-05-11 4 views
3

ViewControllerがあり、これはViewModel: NSObjectで初期化する必要があります。ストーリーボードを使用しないときに、必要なinitにfatalErrorを設定することはできますか(コーダーaDecoder:NSCoder)ですか?

ViewControllerの私の実装は次のとおりです。

class ViewController: UIViewController { 

    let viewModel: ViewModel 

    init(withViewModel viewModel: ViewModel) { 
     self.viewModel = viewModel 
     super.init(nibName: nil, bundle: nil) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

} 

ViewModelはシンプルoverride initがあります

class ViewModel: NSObject { 

    override init() { 
     super.init() 
     // Some other logic 
    } 

} 

私はそれがNSCodingプロトコルに準拠するので、私はrequired init?(coder aDecoder: NSCoder)ViewControllerで実装が必要であることを、理解しています。しかし、fatalErrorがあることが安全かどうかは分かりません。私はので、

プロパティ

は私がviewModelオプションの変数を作成したくないでsuper.initコールで初期化されていません 'self.viewModel' を受け取るfatalErrorsuper.init(coder: aDecoder)に変更

私のアプリケーションロジックではnilにすることはできません。 viewModelViewControllerの初期化中に実装する必要がある、唯一の一定でないので、私はinit?(coder...

required init?(coder aDecoder: NSCoder) { 
    self.viewModel = ViewModel() 
    super.init(coder: aDecoder) 
} 

に変更また

、これはまた、私を満たしていません。

だから、私の質問:

  • このinit方法でfatalErrorを持っている、それは安全ですか?
  • 私は私のアプリケーションでストーリーボードを使用しないでください(起動画面のみ)。このinit?(coder...メソッドは実行されないことを確認できますか?
  • fatalErrorなしで書き込むオプションがありますか?
  • 私のアプリケーションで使用されることがあるため、完全な実装が必要ですか?

ありがとうございました!

答えて

4

あなたはコードでそれを使用することはできませんので、あなたは、あなたがあなたのinitを無効にすることができますストーリーボードを使用していないので:

@available(*, unavailable) required init?(coder aDecoder: NSCoder) { 
    fatalError("disabled init") 
} 
+0

この行では、すべてのiOSプラットフォームで無効にするので、 'ViewController'を' coder'で初期化することはできません。実際に私のコードでは、私はこのinitを決して呼び出しません。私はそのフレームワークがどんな場合でもそれを呼び出さないことを確かめたい。だから、私は正しく理解している、それは利用できないので、アプリケーションをコンパイルして実行すると、そのフレームワークもそれを使用しないことを意味しますか?私のnoobの質問に申し訳ありません、私はちょうどそれがどのように動作し、それを安全に理解したい:) –

+1

@PeterTretyakovフレームワークまたは他のファイルが使用できない 'init(coder:)'を使用する場合、コンパイルエラーが表示されます。あなたのコードがコンパイルされていても心配はありません:) –

+0

ストーリーボードを使用しない場合は、このシグニチャイニシャライザがどこにでも表示されます。私はVasiliiの例の後にこのonelinerを使い始めました: '@available(*、unavailable)required init?(コーダー_:NSCoder){fatalError(" init(コーダー:)無効 ")}' – epologee

1

ここでは、あとで擬似データを使ってテストを書くのを簡単にしたい場合、依存関係注入を使って良いスタートアップを得ることができます。

のViewController:

class ViewController: UIViewController { 

    let viewModel = ViewModel() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     viewModel.runFunction() 
    } 
} 

のViewModel:

class ViewModel: NSObject { 

    var networkingService: NetworkingService? 

    init(withNetworkingService networkingService: NetworkingService = null) { 
     self.networkingService = networkingService 
    } 
} 
+0

ありがとうございます!もちろん、わかっているように、私は自分のコードをより明確かつきれいにしようとしています。Dependency Injectionは私の学習リストにありますが、今はこの 'initの下ですべてを理解しようとしています(コーダー...' funcですから依存関係注入はこの質問のケースではありません。 DIのためのチュートリアル、私はそれを感謝します:) –

+1

チュートリアルの段階にいるなら、私はレイWenderLichをお勧めします、私は彼から多くを学んだ。 https://www.raywenderlich.com/category/swift – Vollan

関連する問題