在 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()
.
我经常在 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()
.