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 のなかみ
}
}