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.oneen 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