Subclase Swift - cómo anular Init()


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
  }
}

Estoy tratando de 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 ninguna de esas clases de características que tienen un método init() con argumentos reales en él. Todas sus iniciativas están desprovistas de argumentos.

Entonces, ¿cómo se hace esto?

Author: sirab333, 2014-07-02

4 answers

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

Un inicializador designado debe asegurarse de que todas las propiedades introducido por su clase se inicializan antes de delegar hasta un inicializador de superclase. (El Lenguaje de programación Swift - > Guía del Lenguaje - > Inicialización)

Así, para que funcione:

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

Esta simple inicialización a cero podría haber sido hecha por establecer el valor predeterminado de la propiedad a cero también. También se anima a hacerlo:

var numberPriorVisits: Int = 0

Si no desea dicho valor predeterminado, tendría sentido extender su 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)
}
 33
Author: Jens Wirth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-02 02:57:30

En swift 2.0 y Posteriores 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 
}
 11
Author: Roman Safin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-02 06:17:06

Pasa argumentos a un inicializador de la misma manera que pasa 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 Designated y Convenience Initializers In Action de la Guía de idiomas de Swift.

 3
Author: Chuck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-02 02:49:32

¿Ha intentado establecer un valor a numberPriorVisits y cambiar los tipos de 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)
    }
}
 0
Author: Peter Witham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-02 02:54:30