"对成员'init(...)的模糊引用"调用baseclass初始化程序

mea*_*ers 7 inheritance super ios swift swift2

我有一个基类:

class ViewController: UIViewController
{
    init(nibName nibNameOrNil: String?)
    {
        super.init(nibName: nibNameOrNil, bundle: nil)
    }

    required init?(coder aDecoder: NSCoder) { }
}
Run Code Online (Sandbox Code Playgroud)

子类:

class OneViewController: ViewController
{
    private var one: One
    init(one: One)
    {
        self.one = one

        super.init(nibName: "OneNib")
    }

    required init?(coder aDecoder: NSCoder) { }
}
Run Code Online (Sandbox Code Playgroud)

以及上述子类的子类:

class TwoViewController: OneViewController
{
    private var two: Two
    init(two: Two)
    {
        self.two = two

        super.init(nibName: "TwoNib") <== ERROR
    }

    required init?(coder aDecoder: NSCoder) { }
}
Run Code Online (Sandbox Code Playgroud)

在指定的行我得到错误:

Ambiguous reference to member 'init(one:)'

我不明白为什么编译器无法弄清楚我指的是ViewControllerinit(),喜欢它设法在做Oneinit().

我错过了什么和/或做错了什么?

mat*_*att 8

我不明白为什么编译器无法弄清楚我指的是ViewController init(),就像它设法在One中做的那样init()

这是因为,从TwoViewController内部,编译器无法看到 ViewController init.规则是:

一旦实现了指定的初始化程序,就会阻止初始化程序的继承.

因此,OneViewController只有一个初始化程序,即init(one:).因此,这是superTwoViewController可以调用的唯一初始化程序.

如果你希望ViewController init(nibName:)出现在OneViewController中,你必须在OneViewController中实现它(即使它只是调用它super).