Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

UIViewControllerのサブクラスでの初期化定義

More than 3 years have passed since last update.

UIViewControllerをプログラムで作成する場合の初期化(init)の定義方法のまとめです。

新規作成のViewControllerにinitがない

例えば新規「Single View App」を作るとViewController.swiftが作られます。
このファイルにはinitのコードはありません。viewDidLoadなど一部のコードがあるだけです。
「initは定義する必要なし?」かなと思いましたが、親クラスのinitを実行しているようです。

このViewControllerはデフォルトでMain.storyboardに関連づけられているのでこれで問題ありません。

自作のUIViewControllerをプログラムで生成する場合

UIViewControllerのinitを利用する場合は、以下のようになると思います。

let vc = CustomViewController(nibName: nil, bundle: nil)

nil渡すのめんどくさいので、引数なしのinitを定義しますが、初期化方法を理解していないと意外とはまります。

例えば以下のコードを追加するとエラーです。

/// エラーです!
init() {
   // 処理省略
}

サブクラスでinitを定義するときには、必ずrequiredメソッドを実装する必要があります。

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

よく見る奴ですね。ただし、requiredを使わないパターンもあります。それが"convenience init"です。

convenience init() {
   self.init(nibName: nil, bundle: nil)        
}

"convenience init"は初期化っぽく見えますが、初期化処理をラッピングして利用する方法のようです。initとは違います。そのためletなどの初期化はconvenienceの中ではエラーになります。

まとめ

独自のinitを定義する場合はサブクラスでもrequiredも必要になる。convenienceはinitとは違うのでプロパティの初期化はできないようです。

pol-inc
「未来を加速する(Accelerate the Future.)」 それがPOLのミッションです。 課題解決とイノベーションにより、良い未来の到来を早める。私たちにしか創れない良い未来を創る。 私たちがPOLに集まっているのは、このためです。
https://pol.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away