在 UIViewController 的 convenience init 中调用了什么初始化器?

What initializer called in convenience init of UIViewController?

我经常在 UIViewController 中使用 convenience init 来制作自定义初始化程序。

但我不知道 UIViewController 的现有初始化程序在 self.init() 时被调用。

public init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?)吗?

UIViewController 的 convenience init 中 self.init() 时调用什么?

final class SampleViewController: UIViewController {
    private var component: Component?

    convenience init(component: Component) {  // Custom initializer
       self.init()  // What is this initializer?
       self.component = component
    }

    override func viewDidLoad() {
       ...
    }
    ...
}

这取决于 UIViewController 是如何实例化的。

如果通过代码直接调用,则可能是 init(nibName: String?, bundle: Bundle?),如果通过 Interface Builder 机制(Storyboard Segue、Main View Controller 等)实例化,则可能是 init?(coder: NSCoder)

UIViewController.init 呼叫 UIViewController.init(nibName: nil, bundle: nil)。这意味着 nibName 将等于 class 的名称,并且 bundle 将成为主包。

UIViewController.init 只是一个方便的初始值设定项。在 swift 中,这可以使用默认参数 UIViewController.init(nibName: String? = nil, bundle: NSBundle? = nil) 来实现,但这是一个旧的 Objective-C API 并且 Objective-C 没有默认参数,这就是为什么有一个分开方便init().