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?
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)
}
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
}
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.
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)
}
}