Operator overloading

class Point {
    var x: Double
    var y: Double

    init(x: Double, y: Double) {
        self.x = x
        self.y = y
    }
}

infix operator ^
//global function
func ^ (p: Point, power: Double) -> Point {
    let x = pow(p.x, power)
    let y = pow(p.y, power)
    return Point(x: x, y: y)
}

postfix operator ^
//global function
postfix func ^ (p: inout Point) {
    let x = pow(p.x, p.x)
    let y = pow(p.y, p.y)
    p = Point(x: x, y: y)
}


var p1 = Point(x: 2, y: 3)
p1 = p1 ^ 3
//p1.x is 8.0 and p1.y is 27.0

var p2 = Point(x: 2, y: 3)
p2^
//p2.x is 4.0 and p2.y is 27.0

print("x = \(p1.x), y = \(p1.y)")
print("x = \(p2.x), y = \(p2.y)")