駐車場
CoddyのSwiftジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 55/57。
チャレンジ
難しい駐車場を構築してください。プロトコル Vehicle には、plate、size(small = 1、medium = 2、large = 3 を持つ列挙型 Size: Int, Comparable)、および hourlyRate があります。Motorbike(small、1時間あたり1)、Car(medium、3)、Van(large、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プレイグラウンド