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
** 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
Ja, genau das passiert. – ogres
@orges Vielen Dank :) – SLN