커스텀 타입에도 메서드 형태로 연산자 (+,-,== 등)을 구현 가능 : 연산자도 사실은 내부적으로 다 구현이 되어있는 타입 메서드임.
연산자 : 타입. 함수이름(파라미터: 타입) 형태로 실행하지 않는 특별한 형태이 타입 메서드임
struct Vector2D {
var x = 0.0
var y = 0.0
}
1) 산술 더하기 연산자의 구현
extension Vector2D {
static func + (lhs: Vector2D, rhs: Vector2D) -> Vector2D {
return Vector2D(x: lhs.x + rhs.x, y: lhs.y + rhs.y)
}
}'
let vetoor = Vector2D(x: 3.0, y: 1.0)
let anotherVector = Vector2D(X: 2.0, y: 4.0)
let combinedVector = vector + anotherVector
2) 단항 prefix 연산자의 구현
extension Vector2D {
static prefix func - (vector: Vector2D) -> Vector2D {
return Vector2D(x: -vector.x, y: -vector.y)
}
}
let positive = Vector2D(x: 3.0, y: 4.0)
let negative = -positive
3) 복합 할당 연산자의 구현
extension Vector2D {
static func += (left: inout Vector2D, right: Vector2D) {
left = left + right
}
}
4) 동일 비교 연산자의 구현
extension Vector2D: Equatable, Comparable {
static func == (left: Vector2D, right: Vector2D) -> Bool {
return (left.x == right.x) && (left.y == right.y)
}
}
5) 크기 비교 연산자의 구현
extension Vector2D: Equatable, Comparable {
static func < (left: Vector2D, right: Vector2D) -> Bool {
return (left.x < right.x) && (left.y < right.y)
}
}