停车场
本课属于 Coddy Swift 学习旅程的“面向对象编程”单元。第 55 课,共 57 课。
挑战
困难构建一个停车场。协议 Vehicle 包含 plate、size(一个枚举 Size: Int, Comparable,其中 small = 1、medium = 2、large = 3)和 hourlyRate。实现 Motorbike(小型,每小时 1)、Car(中型,每小时 3)和 Van(大型,每小时 5)。创建类 Garage 时,需要指定每种尺寸的车位数量。park(_:) 会将车辆停入一个空闲的同尺寸车位;如果没有空位,则停入下一个更大尺寸的空位,并返回 parked AB12 in medium 或 full for AB12。leave(plate:hours:) 会释放车位,并返回 AB12 paid 9(费率乘以时长,至少按 1 小时计算)或 no vehicle AB12。status() 会返回 free: small 1, medium 0, large 2。
提供的代码会读取车位数量,格式为 small,medium,large,然后读取命令 park car AB12、leave AB12 3 或 status,并打印每条命令的回复。
你的代码应写在 Size.swift、Vehicle.swift、Motorbike.swift、Car.swift、Van.swift 和 Garage.swift 中。main.swift 中包含提供的输入输出代码,不能编辑。
亲手试试
// 提供的输入/输出代码:保持原样。
var input: [String] = []
while let line = readLine() { input.append(line) }
let s = input[0].split(separator: ",").map { Int($0)! }
let garage = Garage(small: s[0], medium: s[1], large: s[2])
for cmd in input.dropFirst() {
let p = cmd.split(separator: " ").map(String.init)
switch p[0] {
case "park":
let v: any Vehicle
switch p[1] {
case "bike": v = Motorbike(plate: p[2])
case "van": v = Van(plate: p[2])
default: v = Car(plate: p[2])
}
print(garage.park(v))
case "leave": print(garage.leave(plate: p[1], hours: Int(p[2])!))
default: print(garage.status())
}
}
面向对象编程中的所有课
自己练习: Swift 在线编辑器