69
59

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.

Swift で UIViewController のサブクラスを引数なしの -init でインスタンス化する

Last updated at Posted at 2015-04-11

Objective-C ではなにも特別なことをせずに引数なしのイニシャライザで UIViewController のサブクラスをインスタンス化できたんだけど、 Swift では -init をオーバーライドするときは指定イニシャライザを使えと言われる。

StoryBoard を使わないで、かつ AutoLayout を使うときは frame とか渡してもしょうがないでしょ、と思ったので、引数なしの -init を使おうと思ったんだけど、これがなかなか手こずった。

結局以下のように、引数なしの方を convenience にして、そっちから指定イニシャライザを呼んでやることで解決した。よく考えれば Swift ではこう書くしかないというか、 Swift っぽい書き方。(参考: Initializing View Controllers in Swift · The Main Thread)

import UIKit
 
class ViewController: UIViewController {
  
  
  required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    setup()
  }
  
  override init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!) {
    super.init(nibName: nil, bundle: nil)
    setup()
  }
  
  convenience init() {
    self.init(nibName: nil, bundle: nil)
  }

  func setup() {
    // init のなかみ
  }
 
  
}
69
59
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
69
59

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?