struct Point<T> {
let x, y: T
}
func describe<T>(_ point: Point<T>) -> String {
switch point {
case is Point<Int>:
return "Point (int, int)"
case is Point<Double>:
return "Point (double, double)"
default:
return "Point (\(point.x), \(point.y))"
}
}
let p1 = Point(x: 3, y: 4)
let desc1 = describe(p1)
//desc1 is "Point (int, int)"
let p2 = Point(x: 7.1, y: 4.6)
let desc2 = describe(p2)
//desc2 is "Point (double, double)"
let p3 = Point(x: "a", y: "b")
let desc3 = describe(p3)
//desc3 is "Point (a, b)"
print("desc1 is \"\(desc1)\"")
print("desc2 is \"\(desc2)\"")
print("desc3 is \"\(desc3)\"")