with stored protocol property extension cannot ios swift inheritance swift2 super

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 el init() de One init()

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