6
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Storyboardを使ったViewControllerを比較的安全に初期化する

Posted at

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の代入を初期化タイミングのみに限定して、比較的安全に初期化することができます。

6
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?