2016-08-04 50 views
-1

Ich frage mich, ob man eine verschachtelte Klasse, z. Einstellen des Reifendrucks, wenn das Auto Initialisierung:Swift: Initialisierung einer verschachtelten Klasse

class Tyre { 
    var pressure : Double = 0.0 

    init() { } 

    init(withPressure p: Double) { 
     self.pressure = p 
    } 
} 

class Car { 
    var tyre = Tyre() 
} 

// should return 2.5 
let myCar = Car().tyre(withPressure : 2.5).pressure 

Jetzt nur das funktioniert, mit dem Standard-init():

let myCar = Car().tyre.pressure // return 0.0 

Dank Ihrer Ihre Antwort im Voraus!

+0

Sicher aber Sie haben ein Auto initializer zu schreiben, die die Reifen initialisiert. – matt

+0

Ich verstehe das. Ich habe mich nur gefragt, warum die Standard-Init verwendet werden kann (und ist!) Und warum Sie kein Init mit Parametern verwenden können. Vielleicht ist das eine Noob-Frage, aber ich dachte, dass mit "Car(). Tire (withPressure: 2.5)" auch der Reifen initialisiert wird. Aber ich denke nicht ... – etri

Antwort

2

Sie können nicht ganz das tun, aber Sie können in einem benutzerdefinierten Reifen als Parameter an Ihrem Auto init übergeben:

class Tyre { 
    var pressure : Double = 0.0 

    init() { } 

    init(withPressure p: Double) { 
     self.pressure = p 
    } 
} 

class Car { 
    var tyre: Tyre! 

    init(withTyre t: Tyre) { 
     self.tyre = t 
    } 
} 

let myCar = Car(withTyre: Tyre(withPressure : 2.5)) 

// should return 2.5 
let pressure = myCar.tyre.pressure 
0
class Tyre { 
    var pressure : Double = 0.0 

    init() { } 

    init(withPressure p: Double) { 
     self.pressure = p 
    } 
} 

class Car { 
    var tyre = Tyre() 
} 

// should return 2.5 
let myCar = Car() 

myCar.tyre = Tyre(withPressure: 2.5) 

print(myCar.tyre.pressure) 
1

Sie haben tyre separat zu initialisieren. Du könntest es auf zwei Arten tun. Entweder Car könnte eine Art Druckparameter nehmen:

class Car { 
    var tyre 

    init(withTyrePressure tyrePressure: Double) { 
     tyre = Tyre(withPressure: tyrePressure) 
    } 
} 

Oder Car kann nehmen tyre Parameter:

class Car { 
    var tyre 

    init(withTyre tyre: Tyre) { 
     self.tyre = tyre 
    } 
} 

let tyre = Tyre(withPressure: 2.5) 
let car = Car(withTyre: tyre) 
+0

Danke für die Alternative! – etri

+0

Dies ist die beste Antwort, da es beide Möglichkeiten zeigt, wie Sie Ihren Car Initializer schreiben. Wie auch immer, was Sie (das OP) zu tun wünschen, erfordert einen Car-Initialisierer. Sie können die Regeln der Sprachsyntax nicht auf magische Weise verletzen. – matt

1
class Tyre { 
    var pressure : Double = 0.0 

    init() { } 

    init(withPressure p: Double) { 
     self.pressure = p 
    } 
} 

class Car { 
    var tyre : Tyre 
    init(withPressure p:Double) { // <-- this is the only change from your code 
     self.tyre = Tyre(withPressure:p) 
    } 
} 

// should return 2.5 
let myCar = Car(withPressure : 2.5) 
myCar.tyre.pressure // 2.5 
0

ich eine Antwort auf meine Frage gefunden, aber musste die Klasse Auto ändern, indem Sie ein Funktionsreifen, der anstelle einer Eigenschaft die Klasse Tire zurückgibt. So kann es getan werden! ;-)

Das folgende Beispiel ist vielleicht nicht sinnvoll, sondern nur ein Beweis für das Prinzip ist ...

class Tyre { 
    var pressure : Double = 0.0 

    init() { } 

    init(withPressure p: Double) { 
     self.pressure = p 
    } 
} 

class Car { 
    //var tyre = Tyre(withPressure: 2.5) 

    func tyre (withPressure p: Double) -> Tyre { 
     return Tyre(withPressure: p) 
    } 
} 


let myCar = Car().tyre(withPressure: 2.2).pressure