ios - stored - "Referencia ambigua al init del miembro ''(...)" iniciador de clase base de llamadas
swift 4 constructor (3)
No entiendo por qué el compilador no puede entender que me refiero a
init()
ViewController, como lo hizo en elinit()
de Oneinit()
Es porque, desde dentro de TwoViewController, el compilador no puede ver el init
de ViewController. La regla es:
Tan pronto como implemente un inicializador designado, bloqueará la herencia de inicializadores.
Por lo tanto, OneViewController solo tiene un inicializador, es decir, init(one:)
. Por lo tanto, ese es el único inicializador super
que TwoViewController puede llamar.
Si desea que init(nibName:)
esté presente en OneViewController, debe implementarlo en OneViewController (incluso si todo lo que hace es llamar a super
).
Tengo una clase base:
class ViewController: UIViewController
{
init(nibName nibNameOrNil: String?)
{
super.init(nibName: nibNameOrNil, bundle: nil)
}
required init?(coder aDecoder: NSCoder) { }
}
una subclase:
class OneViewController: ViewController
{
private var one: One
init(one: One)
{
self.one = one
super.init(nibName: "OneNib")
}
required init?(coder aDecoder: NSCoder) { }
}
y una subclase de la subclase anterior:
class TwoViewController: OneViewController
{
private var two: Two
init(two: Two)
{
self.two = two
super.init(nibName: "TwoNib") <== ERROR
}
required init?(coder aDecoder: NSCoder) { }
}
En la línea indicada obtengo el error:
Ambiguous reference to member ''init(one:)''
No entiendo por qué el compilador no puede entender que me refiero a init()
ViewController
, como lo hizo en el init()
One
init()
.
¿Qué estoy perdiendo y / o haciendo mal?
El capítulo en el manual de Swift sobre Inicializadores Designados lo aclarará, pero básicamente OneViewController
solo tiene una forma de establecer self.one
, y eso es inicializando usando init(one: One)
. No puedes soslayar eso, que es lo que estás tratando de hacer.
Si lo que intentas hacer puede tener éxito, ¿qué valor tendría
two.one
en lo siguiente?let two = Two(two: SomeTwo) print(two.one)
Respuesta - indefinida Es por eso que no está permitido.
Habiendo declarado One.init(one:)
ahora es el inicializador designado, y no hay forma de One.init(one:)
.
no es necesario pasar el valor al ViewController del constructor. puede definir objeto público en oneViewController y puede acceder a outer.
class OneViewController: ViewController {
public var one: One
}
let vc = storyboard?.instantiateViewControllerWithIdentifier("OneViewController") as OneViewController
let one = One()
vc.one = one