私の意見ではストーリーボードを使用する場合に依存性の注入のための良い方法はありません。私はストーリーボードはオブジェクト指向の設計原則に反していると思います。チームのソフトウェア開発では、プロトタイピングを除いて、私はそれらの使用をお勧めしません。
代わりに、私は単純なxibファイルを使用して、画面(別名UIViewController)をできるだけ独立させようとします。また、UIViewController(ビューツリーの構築/管理)の主な目的からアニメーションナビゲーションを分離するために、独自のワイヤフレームクラスの画面間でナビゲーションを実装しています。インタフェースビルダーを使用する利点を完全に失うことなく、必要なオブジェクトを注入することが可能です。
例:
final class MyViewController: UIViewController {
convenience override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
self.init()
}
convenience required init(coder aDecoder: NSCoder) {
self.init()
}
convenience init() {
fatalError("Not supported!")
}
init(viewModel: ViewModel, wireframe: Wireframe) {
self.viewModel = viewModel
self.wireframe = wireframe
super.init(nibName: "MyViewController", bundle: Bundle(for: type(of: self)))
}
private let viewModel: ViewModel
private let wireframe: Wireframe
override func viewDidLoad() {
super.viewDidLoad()
// do something with viewModel
}
@IBAction func close() {
wireframe.close()
}
}
let wireframe: Wireframe = ConcreteWireframe()
let viewModel: ViewModel = ConcreteViewModel()
let screen: UIViewController = MyViewController(viewModel: viewModel, wireframe: wireframe)
カスタムのinitを使用することはできませんが、暗黙のうちに開封されたオプションのプロパティを行うことができます 'VARゲーム:!ゲーム'。この方法では、使用する前に展開する必要はありませんが、使用するとクラッシュして、それがnil以外の値に設定される前にクラッシュします。 – dan