Storyboardを使ったViewControllerはSwiftと相性が悪いですよね。
今回は、初期化を行うstaticメソッドを生やすことで、比較的安全に初期化を行う方法を考えました。
Storyboardを使ったViewController初期化の問題
Storyboardを使ったViewControllerの初期化時に値を渡そうとすると、internalかつvarで宣言したpropertyを外部から代入する、といったことになりがちです。
final class ViewController: UIViewController {
var userId: Int?
}
let viewController = // Storyboardを使った初期化
viewController.userId = userId // internalかつvarにしないとアクセスできない
この場合、userId
というpropertyはクラス内部と外部、どちらからも任意のタイミングで代入ができてしまいます。
初期化を行うStaticメソッドを生やす
初期化を行うstaticメソッドを以下のように生やすことで、比較的安全に初期化をすることができます。
final class ViewController: UIViewController {
private var userId: Int?
static instantiateViewController(userId: Int) -> Self {
let viewController = // Storyboardを使った初期化
viewController.userId = userId
return viewController
}
}
let viewController = ViewController.instantiateViewController(userId: userId)
この書き方では、クラス外部からはpropertyに直接アクセスできず、staticメソッド経由の初期化に限定することができます。
まとめ
Storyboardを使ったViewControllerはSwiftと相性が悪いですが、初期化を行うstaticメソッドを生やすことで、外部からのpropertyの代入を初期化タイミングのみに限定して、比較的安全に初期化することができます。