斯威夫特以条件选择具体价值

时间:2017-09-29 15:03:09

标签: swift dictionary inheritance

我正在使用Swift应用一个简单的继承项目。但是,在完成我的代码之后,一直都会出现这个错误。这个项目创建了车辆类,并有2个子类,如Car和Bicycle。 汽车速度取决于其选择的齿轮。 所以我实现了一个gearBox字典,它有齿轮作为键,速度和值一样。

我不确定是否可以通过在我的Car类中控制其档位来分配速度值。

任何帮助都将不胜感激。

  

我的错误   游乐场执行失败:错误:psionix.playground:19:34:错误:在super.init初始化self之前,在属性访问'speed'中使用'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()

3 个答案:

答案 0 :(得分:0)

在你设定速度之前,你是自行车和汽车。在调用super.init方法之前添加速度 编辑本

   init(hasBasket: Bool){
    speedBicycle = 0
    super.init(speedVehicle: speedBicycle)
    self.hasBasket = hasBasket
}

这个

 init(){
    speedCar = 0
    super.init(speedVehicle: speedCar)
}

答案 1 :(得分:0)

问题是你试图调用超类的初始值设定项而不实际提供所有必要的值作为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已经从[{1}}继承了speed属性,VehiclespeedBicycle的属性相同。

如果您希望所有子类实例具有相同的速度,只需在init方法中设置默认值,如下所示:

Bicycle

此外,您不应该遍历字典来查找某个键,您可以使用下标安全地访问值。如果该密钥不存在,则该值将仅为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

答案 2 :(得分:0)

任何车辆的初始速度都是用户期望的值,或默认为0,这是有道理的。汽车也是如此,由于汽车是汽车,你不需要两种不同的速度。

这将是我精心设计的方法:

import Foundation

class Vehicle: CustomStringConvertible {

    var speedInKmH: Double

    init(speedInKmH: Double = 0) {
        self.speedInKmH = speedInKmH
    }

    var description: String {
        return "Vehicle has \(speedInKmH) km/h speed by default."
    }
}

struct GearBox {
    var gear: Int
    var speedInKmH: Double
}

class Car: Vehicle {

    let gearBox: [GearBox] = [GearBox(gear: 1, speedInKmH: 10.5), GearBox(gear: 3, speedInKmH: 33.4), GearBox(gear: 5, speedInKmH: 51.2),
                        GearBox(gear: 2, speedInKmH: 23.3), GearBox(gear: 4, speedInKmH: 45.0)]

    func travelTimeInHoursWith(distanceInKm: Double, gear: Int) -> Double {

        if let matchedGearBox = gearBox.filter({ $0.gear == gear }).first {
            self.speedInKmH = matchedGearBox.speedInKmH
        }

        return distanceInKm / speedInKmH
    }

    override var description: String {
        return "My Car has \(self.gearBox.count) gears and has \(self.speedInKmH) km/h speed."
    }
}

let toyota = Car()
print(toyota.travelTimeInHoursWith(distanceInKm: 22, gear: 4))
print(toyota)

我做了一些改进以使其清楚,您可以将我的代码作为示例并修改您的其他实现的类/类