根据条件快速选择特定值

标签 swift dictionary inheritance

我正在使用 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/

相关文章:

ios - 快速获取至少包含一种媒体的 smartAlbum

python - 如何在 Python 中循环遍历两个字典

dictionary - 在哪里可以下载文本格式的英语词典数据库?

c# - 字符串数组查找字典

C++继承问题

python - 为什么我们更喜欢使用 self.method() 而不是 Class.method(self)

swift - Alamofire 请求发送两次

ios - 使用 Swift 将对象添加到数组而不重复

c# - System.Object 是基类

ios - 在不同设备上动态设置 Collection View 单元格大小