"Ambiguous reference to member 'init(...)" 调用基类初始化器
"Ambiguous reference to member 'init(...)" calling baseclass initializer
我有一个基类:
class ViewController: UIViewController
{
init(nibName nibNameOrNil: String?)
{
super.init(nibName: nibNameOrNil, bundle: nil)
}
required init?(coder aDecoder: NSCoder) { }
}
子类:
class OneViewController: ViewController
{
private var one: One
init(one: One)
{
self.one = one
super.init(nibName: "OneNib")
}
required init?(coder aDecoder: NSCoder) { }
}
和上述子类的子类:
class TwoViewController: OneViewController
{
private var two: Two
init(two: Two)
{
self.two = two
super.init(nibName: "TwoNib") <== ERROR
}
required init?(coder aDecoder: NSCoder) { }
}
在指示的行我得到错误:
Ambiguous reference to member 'init(one:)'
我不明白为什么编译器无法弄清楚我指的是 ViewController
的 init()
,就像它在 One
的 init()
.
我错过了什么and/or做错了什么?
Swift 手册中关于 Designated Initializers 的章节将对其进行澄清,但基本上 OneViewController
只有一种设置 self.one
的方法,那就是使用 init(one: One)
。你无法绕过它,而这正是你想要做的。
如果您尝试做的事情能够成功,那么two.one
在以下方面会有什么价值?
let two = Two(two: SomeTwo)
print(two.one)
答案 - 未定义。这就是不允许这样做的原因。
声明 One.init(one:)
它现在是指定初始化器,没有办法绕过它。
您不必将值传递给构造函数的 ViewController。您可以在一个 ViewController 中定义 public 对象,然后访问外部 .
class OneViewController: ViewController {
public var one: One
}
let vc = storyboard?.instantiateViewControllerWithIdentifier("OneViewController") as OneViewController
let one = One()
vc.one = one
I don't understand why the compiler can't figure out I'm referring to ViewController's init()
, like it managed to do in One's init()
这是因为,从 TwoViewController 内部,编译器无法 看到 ViewController 的 init
。规则是:
一旦你实现了一个指定的初始化器,你就阻止了初始化器的继承。
因此,OneViewController只有一个初始化器,即init(one:)
。因此,这是 TwoViewController 可以调用的唯一 super
初始化器。
如果您希望 ViewController 的 init(nibName:)
出现在 OneViewController 中,您必须 在 OneViewController 中实现 =](即使它所做的只是调用 super
)。
我有一个基类:
class ViewController: UIViewController
{
init(nibName nibNameOrNil: String?)
{
super.init(nibName: nibNameOrNil, bundle: nil)
}
required init?(coder aDecoder: NSCoder) { }
}
子类:
class OneViewController: ViewController
{
private var one: One
init(one: One)
{
self.one = one
super.init(nibName: "OneNib")
}
required init?(coder aDecoder: NSCoder) { }
}
和上述子类的子类:
class TwoViewController: OneViewController
{
private var two: Two
init(two: Two)
{
self.two = two
super.init(nibName: "TwoNib") <== ERROR
}
required init?(coder aDecoder: NSCoder) { }
}
在指示的行我得到错误:
Ambiguous reference to member 'init(one:)'
我不明白为什么编译器无法弄清楚我指的是 ViewController
的 init()
,就像它在 One
的 init()
.
我错过了什么and/or做错了什么?
Swift 手册中关于 Designated Initializers 的章节将对其进行澄清,但基本上 OneViewController
只有一种设置 self.one
的方法,那就是使用 init(one: One)
。你无法绕过它,而这正是你想要做的。
如果您尝试做的事情能够成功,那么
two.one
在以下方面会有什么价值?let two = Two(two: SomeTwo) print(two.one)
答案 - 未定义。这就是不允许这样做的原因。
声明 One.init(one:)
它现在是指定初始化器,没有办法绕过它。
您不必将值传递给构造函数的 ViewController。您可以在一个 ViewController 中定义 public 对象,然后访问外部 .
class OneViewController: ViewController {
public var one: One
}
let vc = storyboard?.instantiateViewControllerWithIdentifier("OneViewController") as OneViewController
let one = One()
vc.one = one
I don't understand why the compiler can't figure out I'm referring to ViewController's
init()
, like it managed to do in One'sinit()
这是因为,从 TwoViewController 内部,编译器无法 看到 ViewController 的 init
。规则是:
一旦你实现了一个指定的初始化器,你就阻止了初始化器的继承。
因此,OneViewController只有一个初始化器,即init(one:)
。因此,这是 TwoViewController 可以调用的唯一 super
初始化器。
如果您希望 ViewController 的 init(nibName:)
出现在 OneViewController 中,您必须 在 OneViewController 中实现 =](即使它所做的只是调用 super
)。