web-dev-qa-db-de.com

Swift Subclassing - Überschreiben von Init ()

Ich habe die folgende Klasse mit einer init-Methode:

class user {
  var name:String
  var address:String

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

Ich versuche, diese Klasse zu subclassieren, aber ich bekomme ständig Fehler im super.init()-Teil:

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

Apples iBook bietet Beispiele für Unterklassen, jedoch keine Feature-Classes, die eine init()-Methode mit tatsächlichen Argumenten enthalten. Alle ihre Init's sind frei von Argumenten.

Wie machst du das?

39
sirab333

Zusätzlich zu Chucks Antwort müssen Sie auch Ihre neue Eigenschaft initialisieren, bevor Sie super.init aufrufen

Ein ausgewiesener Initialisierer muss sicherstellen, dass alle Eigenschaften Die von ihrer Klasse eingeführte Klasse wird initialisiert, bevor sie an eine .__ delegiert wird. Superklasse-Initialisierer. (Die schnelle Programmiersprache -> Sprachführer -> Initialisierung)

Damit es funktioniert:

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

Diese einfache Initialisierung auf Null könnte auch durch Setzen des Standardwerts der Eigenschaft auf Null erfolgen. Es wird auch empfohlen, dies zu tun:

var numberPriorVisits: Int = 0

Wenn Sie keinen solchen Standardwert wünschen, ist es sinnvoll, den Initializer zu erweitern, um auch einen neuen Wert für die neue Eigenschaft festzulegen:

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

In Swift 2.0 und später funktioniert das so (alle Fälle)

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
Roman Safin

Sie übergeben Argumente an einen Initialisierer, ähnlich wie Sie Argumente an eine normale Methode übergeben:

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

Zu Referenzzwecken wird dies im Abschnitt Designated und Convenience Initializer In Action des Swift Language Guide gezeigt.

3
Chuck

Haben Sie versucht, einen Wert auf numberPriorVisits festzulegen und die Typen für die Aufrufe in super zu ändern

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
Peter Witham