我正在使用 Swift 应用一个简单的继承项目。然而,完成我的代码后,总是出现此错误。该项目创建车辆类,并有 2 个子类,即汽车和自行车。 汽车的速度取决于其选择的档位。 因此,我实现了一个 gearBox 字典,其中 gear 作为键,速度作为值。
我不确定是否可以通过控制汽车类中的齿轮来分配速度值。
如有任何帮助,我们将不胜感激。
MY ERROR Playground execution failed: error: psionix.playground:19:34: error: use of 'self' in property access 'speed' before super.init initializes self super.init(speedVehicle: speed) ^
我的代码
//: Playground - noun: a place where people can play
import UIKit
class Vehicle{
var speed : Double
init(speedVehicle:Double){
speed = speedVehicle
}
func printDescription(){
print("Vehicle has \(speed) km/h speed by default.")
}
}
class Car : Vehicle{
var speedCar :Double
let gearBox : [Int : Double] = [1:10.5, 2:23.3, 3:33.4, 4:45.0, 5:51.2]
init(){
super.init(speedVehicle: speed)
}
func calculateTravelTime(distance:Double, gearCar:Int)->Double{
var travelTime : Double
travelTime = distance/speedCar
for (gear, speed) in gearBox{
if(gear == gearCar){
speedCar = speed
}
}
return travelTime
}
override func printDescription() {
print("My Car has \(gearBox.count) gears and has \(speedCar) km/h speed.")
}
}
class Bicycle : Vehicle{
var hasBasket : Bool
var distance : Double // in km
var speedBicycle : Double
init(hasBasket: Bool){
super.init(speedVehicle: speed)
self.hasBasket = hasBasket
}
func calculateTravelTime(speed:Double)->Double{
let time = (distance/speed)
print("Bicycle travel time is: \(time)")
return time
}
override func printDescription() {
if(hasBasket == true){
print("My Bicycle has \(speedBicycle) km/h speed and its has a basket.")
}
else{
print("My Bicycle has \(speedBicycle) km/h speed and its has no basket.")
}
}
}
let myVehicle = Vehicle(speedVehicle:3.0)
myVehicle.printDescription()
let myCar = Car()
print("My car travel time is \(myCar.calculateTravelTime(distance: 100.0, gearCar:3)) hours.")
myCar.printDescription()
let myBicycle = Bicycle(hasBasket:true)
print("My bicycle travel time is \(myBicycle.calculateTravelTime(speed: 10)) hours.")
myBicycle.printDescription()
最佳答案
问题是您试图调用父类(super class)的初始化程序,而没有实际提供所有必要的值作为 super.init(speed:)
的输入参数。 。您需要更改 init 方法以提供速度值。
class Car : Vehicle{
...
init(speed: Double){
super.init(speedVehicle: speed)
}
}
class Bicycle : Vehicle{
...
init(speed: Double,hasBasket: Bool){
super.init(speedVehicle: speed)
self.hasBasket = hasBasket
}
}
对您所有的 Vehicle
执行相同的操作子类。此外,speedCar
不需要属性,因为 Car
已经有 speed
继承自 Vehicle
的属性(property),与 speedBicycle
相同在Bicycle
.
如果您希望所有子类实例具有相同的速度,只需在 init 方法中设置默认值,如下所示:
class Car : Vehicle{
...
init(){
let carSpeed = 50.0
super.init(speedVehicle: carSpeed)
//you could even do super.init(speedVehicle: 50), I just used a variable for clarity
}
}
此外,您永远不应该迭代字典来查找某个键,您可以使用下标安全地访问值。如果键不存在,则值将只是 nil
.
func calculateTravelTime(distance:Double, gearCar:Int)->Double{
if let currentSpeed = gearBox[gear] {
speedCar = currentSpeed
}
return distance/speedCar
}
关于根据条件快速选择特定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46491694/