88 lines
1.9 KiB
Swift
88 lines
1.9 KiB
Swift
// https://carrascomolina.com
|
|
import Playgrounds
|
|
import Foundation
|
|
|
|
protocol Vehicle {
|
|
// name ist read-only
|
|
var name: String {get}
|
|
var color: String {get set}
|
|
}
|
|
protocol Garage {
|
|
associatedtype V: Vehicle
|
|
func park(vehicle: V)
|
|
|
|
}
|
|
|
|
struct BikeGarage: Garage {
|
|
|
|
|
|
func park(vehicle: Bike){
|
|
vehicle.emptyBasket()
|
|
}
|
|
}
|
|
|
|
struct Train: Vehicle {
|
|
var name: String
|
|
var color = "white"
|
|
var delay = 0 // nicht im protocol
|
|
|
|
func delayed(minutes: Int) -> Train {
|
|
var train = self
|
|
train.delay = minutes
|
|
return train
|
|
}
|
|
|
|
let makeSomeNoise = { (noise: String) -> String in
|
|
noise.uppercased()
|
|
}
|
|
var content: () -> Vehicle
|
|
}
|
|
|
|
struct ICE: Vehicle {
|
|
var name = "ICE"
|
|
var color = "white"
|
|
}
|
|
|
|
struct Bike: Vehicle, CustomStringConvertible {
|
|
var name: String
|
|
var color: String
|
|
// newValue ist ein special keyword
|
|
func emptyBasket(){
|
|
print(description + " korb ausgekippt", Date())
|
|
}
|
|
var description: String {
|
|
set { name = newValue }
|
|
get {"A \(price)€ bike called \(name) and it is \(color)." }}
|
|
static let trek = Bike(name: "Trek", color: "red" )
|
|
|
|
var price: some Equatable {
|
|
// switch (Int.random(in: 1...3)) {
|
|
// case 1:
|
|
// Double.random(in: 1000...9000)
|
|
// case 2:
|
|
// "Free"
|
|
// default:
|
|
Int.random(in: 100...900)
|
|
// }
|
|
}
|
|
}
|
|
var bike = Bike.trek
|
|
let train = Train(name: "RadZug", content: { Bike.trek })
|
|
|
|
#Playground {
|
|
// var greeting = "Hallo Playground"
|
|
|
|
// var train = Train(name:"ICE")
|
|
// bike.description
|
|
// bike.description = "Mein Rad"
|
|
// bike.description
|
|
|
|
// train
|
|
// train.delayed(minutes: 23)
|
|
// BikeGarage().park(vehicle: bike)
|
|
// print( bike)
|
|
// train.makeSomeNoise("huhu")
|
|
// // write code here
|
|
|
|
train.content().name
|
|
}
|