2014-07-02 34 views
37

Ich habe die folgende Klasse, mit einer init-Methode:Swift Subklassifizieren - wie außer Kraft setzen Init()

class user { 
    var name:String 
    var address:String 

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

Ich versuche, diese Klasse zu Unterklasse, aber ich erhalte immer Fehler auf dem super.init() Teil:

Apples iBook hat Beispiele für Unterklassen, aber keine Feature-Classes, die eine init()-Methode mit allen tatsächlichen Argumenten enthalten. Alle ihre Initialen sind frei von Argumenten.

Also, wie machst du das?

+0

Ich denke, Sie können (und sollten) Ihren Code sauberer machen, indem Sie die Klasse in Großbuchstaben richtig deklarieren? – Anima

Antwort

32

Neben Chuck Antwort einstellen, müssen Sie auch Ihre neue eingeführte Eigenschaft initialisieren, bevor super.init Aufruf

Ein designierter Initializer muss sicherstellen, dass alle von seiner Klasse eingeführten Eigenschaften initialisiert werden, bevor er an einen Superklasseninitialisierer delegiert wird. (The Swift Programming Language -> Language Guide -> Initialisierung)

So, damit es funktioniert:

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

Diese einfache Initialisierung auf Null durch Einstellen der Unterkunft Standardwert getan haben könnte auch zu Null. Es wird auch dazu ermutigt:

var numberPriorVisits: Int = 0 

Wenn Sie nicht so einen Standardwert wollen es Sinn machen würde Ihre initializer auch einen neuen Wert für die neue Eigenschaft zu erweitern:

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

Nun, ich hatte wirklich gehofft, dass ich * nicht * einen Standardwert von "numberPriorVisits" setzen muss - aber Sie sagen, dass das tatsächlich gefördert wird? Können Sie teilen, wo Sie gelernt haben, dass es gefördert wird? Im Allgemeinen versuche ich zu verstehen, was die beste Praxis ist, wenn es um "init's" in Swift geht. Ist es besser, all Ihren Eigenschaften einen Standardwert zu geben und Ihre Init-Methode argumentfrei zu lassen? Oder ist es am besten, ** NOT ** irgendwelche Standardwerte zu haben und alles durch Übergeben von Argumenten in 'init' zu tun? – sirab333

+0

@sirab: Mit ermutigt meine ich, dass, wenn Sie es auf einen bestimmten Wert initialisieren möchten, die Verwendung eines Vorschlagswerts für die Eigenschaft empfohlen wird, anstatt die Eigenschaft innerhalb des Initialisierers auf diesen Wert zu setzen. Nun, wenn Ihre Lösung mit Standardwerten arbeitet, dann sind keine Initialisierungsparameter erforderlich. –

+0

@sirab: Ich habe gelernt, dass es ermutigt wird, indem ich den Sprachführer lese. Das gleiche Kapitel wie ich in meiner Antwort erwähnt habe. Er sagt "Wenn eine Eigenschaft immer den gleichen Anfangswert annimmt, geben Sie einen Standardwert an und nicht einen Wert innerhalb eines Initialisierers. Das Endergebnis ist das gleiche, aber ..." Gehen Sie und lesen :-) –

3

Sie übergeben Argumente zu einem initializer viel wie Sie Argumente an eine normale Methode übergeben:

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

Als Referenz wird dies im Designated and Convenience Initializers In Action Abschnitt des Swift Language Guide gezeigt.

0

Haben Sie versucht, einen Wert zu numberPriorVisits und Ändern die Typen für die Anrufe zu 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) 
    } 
} 
11

In swift 2.0 und später funktioniert es 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 
} 
Verwandte Themen