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' を受け取るfatalError
super.init(coder: aDecoder)
に変更
私のアプリケーションロジックではnil
にすることはできません。 viewModel
がViewController
の初期化中に実装する必要がある、唯一の一定でないので、私はinit?(coder...
required init?(coder aDecoder: NSCoder) {
self.viewModel = ViewModel()
super.init(coder: aDecoder)
}
に変更また
、これはまた、私を満たしていません。
だから、私の質問:
- この
init
方法でfatalError
を持っている、それは安全ですか? - 私は私のアプリケーションでストーリーボードを使用しないでください(起動画面のみ)。この
init?(coder...
メソッドは実行されないことを確認できますか? fatalError
なしで書き込むオプションがありますか?- 私のアプリケーションで使用されることがあるため、完全な実装が必要ですか?
ありがとうございました!
この行では、すべてのiOSプラットフォームで無効にするので、 'ViewController'を' coder'で初期化することはできません。実際に私のコードでは、私はこのinitを決して呼び出しません。私はそのフレームワークがどんな場合でもそれを呼び出さないことを確かめたい。だから、私は正しく理解している、それは利用できないので、アプリケーションをコンパイルして実行すると、そのフレームワークもそれを使用しないことを意味しますか?私のnoobの質問に申し訳ありません、私はちょうどそれがどのように動作し、それを安全に理解したい:) –
@PeterTretyakovフレームワークまたは他のファイルが使用できない 'init(coder:)'を使用する場合、コンパイルエラーが表示されます。あなたのコードがコンパイルされていても心配はありません:) –
ストーリーボードを使用しない場合は、このシグニチャイニシャライザがどこにでも表示されます。私はVasiliiの例の後にこのonelinerを使い始めました: '@available(*、unavailable)required init?(コーダー_:NSCoder){fatalError(" init(コーダー:)無効 ")}' – epologee