returning protocol paths isn from called before all initialization swift subclass superclass

initialization - protocol - ''super.init'' isn''t called on all paths before returning from initializer



Subclase Swift: cómo anular Init() (4)

¿Ha intentado establecer un valor para numberPriorVisits y cambiar los tipos para las llamadas a super

class user { var name:String var address:String init(nm: String, ad: String) { name = nm address = ad } } class registeredUser : user { var numberPriorVisits: Int; init(nm: String, ad: String) { self.numberPriorVisits = 0; super.init(nm: nm, ad: ad) } }

Tengo la siguiente clase, con un método init:

class user { var name:String var address:String init(nm: String, ad: String) { name = nm address = ad } }

super.init() subclasificar esta clase pero sigo recibiendo errores en la parte super.init() :

class registeredUser : user { var numberPriorVisits: Int // This is where things start to go wrong - as soon as I type ''init'' it // wants to autocomplete it for me with all of the superclass'' arguments, // and I''m not sure if those should go in there or not: init(nm: String, ad: String) { // And here I get errors: super.init(nm: String, ad: String) // etc....

El iBook de Apple tiene ejemplos de subclases, pero ninguno incluye clases que tengan un método init() con argumentos reales. Todos sus init están desprovistos de argumentos.

¿Entonces como haces esto?


Además de la respuesta de Chuck, también debe inicializar su nueva propiedad introducida antes de llamar a super.init

Un inicializador designado debe garantizar que todas las propiedades introducidas por su clase se inicialicen antes de delegar en un inicializador de superclase. (El lenguaje de programación Swift -> Guía de idiomas -> Inicialización)

Por lo tanto, para que funcione:

init(nm: String, ad: String) { numberPriorVisits = 0 super.init(nm: nm, ad: ad) }

Esta inicialización simple a cero podría haberse realizado estableciendo también el valor predeterminado de la propiedad en cero. También se recomienda hacerlo:

var numberPriorVisits: Int = 0

Si no desea un valor predeterminado como este, tiene sentido extender el inicializador para establecer también un nuevo valor para la nueva propiedad:

init(name: String, ads: String, numberPriorVisits: Int) { self.numberPriorVisits = numberPriorVisits super.init(nm: name, ad: ads) }


En swift 2.0 y posterior funciona así (todos los casos)

init(newString:String) { super.init(string:newString) // Designed initialiser } override init(someString: String) { super.init(mainString: someString) // Override initialiser when subclass some class } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") // Some boilerplate code to handle error (needed when override) } convenience init(newString:String, withParameters:Dictionary<String,String>) { self.init(someString:newString) //Convenience initialiser }


Pasas argumentos a un inicializador de manera similar a como pasas los argumentos a un método normal:

init(nm: String, ad: String) { super.init(nm: nm, ad: ad) }

Como referencia, esto se muestra en la sección Iniciales designadas y de conveniencia en acción de la Guía de idiomas de Swift.