2016-06-01 8 views
0
Schaffung

Hier wird das Codebeispiel aus der Ressource Ich habe LesenCompiler keinen Fehler ausgelöst, wenn ein Objekt aus einem Protokoll

protocol Vehicle { 
    var weight: Int { get } 
    var name: String { get set } 
} 

protocol WheeledVehicle: Vehicle { 
    var numberOfWheels: Int { get } 
    var wheelSize: Double { get set } 
} 


class Bike: WheeledVehicle{ 
    var weight: Int = 30 
    var name: String = "kukulus" 
    var numberOfWheels: Int = 2 
    var wheelSize: Double = 16.2} 

var bike: Bike = Bike() 

bike.numberOfWheels = 16 

var wheeledBike: WheeledVehicle = bike // *** There will be an error, in fact not. 

Für die letzte Zeile (gekennzeichnet mit ***)

Frage 1 Das Buch, das ich gelesen habe behauptet, dass hier ein Fehler vom Compiler ausgelöst wird, dass "Kann nicht zu NumberOfWheels zuweisen!", jedoch ist es nicht. Ist das Buch falsch?

Frage 2var wheeledBike: WheeledVehicle = bike wo WheeledVehicle ein Protokoll ist, ist es nicht wie eine abstrakte Klasse kann das Protokoll nicht ein Objekt instanziiert? Wenn ja, wieso hat mir der Compiler keine Fehlermeldung gegeben?

Update: Wenn Sie den folgenden Code hinzufügt, wird es einen Fehler bemerken sein

wheeledBike.numberOfWheels = 4 

Das Buch nicht falsch ist, wird die obige Zeile einen Fehler einführen, nicht die Linie mit *** markierten

vielen Dank für Ihre Zeit und

Antwort

1

im folgenden Code Ihnen helfen, ein Bike Objekt erstellen, die var numberOfWheels Eigenschaft hat, bedeutet var Sie es und tha ändern ts, warum Sie den Wert von numberOfWheels ändern können.

var bike: Bike = Bike() 
bike.numberOfWheels = 16 

Die folgende Zeile funktioniert, weil Bike Klasse-Protokoll kann WheeledVehicle, so bike entspricht als wheeledBike gegossen werden. Sie erstellen kein neues Objekt, sondern ordnen es nur einer neuen Variablen zu.

var wheeledBike: WheeledVehicle = bike 

Wenn Sie folgenden Code versucht, wäre es nicht, weil wheeledBike Art von WheeledVehicle ist die var numberOfWheels: Int { **get** } hat, hier bedeutet erhalten, dass durch Protokoll, Sie sind nur in der Lage, diesen Wert abzurufen, aber Sie sind NICHT erlaubt zu setzen/ändern.

wheeledBike.numberOfWheels = 16 
+0

** rolledBike ** ist eine Art ** WheeledVehicle **, also ** rolledBike.wheelSize = 21 ** wird nicht fehlschlagen. weil es {gesetzt} hat. Und Fahrrad ist eine Art ** Bike **. Weil der Typ/Klasse Bike die ** numberOfWheels ** als Variable definiert, also wenn ich ** bike.numberOfWheels = 6 ** tippe, wird es auch funktionieren. Bin ich auf dem richtigen Weg? – SLN

+0

Ja, genau das passiert. – ogres

+0

@orges Vielen Dank :) – SLN

Verwandte Themen