
새로운 연산자를 만드는게 아닌 새로운 피 연산자를 비교할수있도록 기능을 추가하는것이다.
몇가지 주의할점이 있는데 연산자가 가지고있는 우선순위나 결합 규칙을 바꾸지 않는다.
가능한 원래 기능과 유사하게 구현해야한다. 논리적인 오류나 가독성이 떨어질수도 있기 때문이다.
리턴하는 값을 이미 기존에 존재하는 파라미터와 리턴 값을 일치시켜야한다.
거의 모든 연산자를 연산자 method로 구현할수 있지만 삼항 연산자나 할당 연산자는 구현할수 없다.
"a" == "a" // == 연산자가 두 문자열을 비교할수 있게 되어있기 때문에 별도의 Method를 만들어줄 필요가없다.
struct Point {
var x = 0.0
var y = 0.0
}
let p1 = Point(x: 12, y: 34)
let p2 = Point(x: 67, y: 89)
p1 == p2 // 컴파일러는 두 인스턴스를 어떻게 비교해야하는지 알수 없기떄문에 우리가 만들어줘야 한다.
extension Point : Equatable {
// static func ==(lhs : Point, rhs: Point) -> Bool {
// return (lhs.x == rhs.x) && (lhs.y == rhs.y)
// }
}
p1 == p2 // 이제 두가지 구조체를 비교할수있다.
p1 != p2 // 이 연산자를 구현하지 않더라도 Equatable protocol을 채용한 저장 속성만 있다면
컴파일러가 자동으로 구현을 추가한다.
extension Point {
//prefix 전치 연산자로 선언된다,
static prefix func -(pt : Point) -> Point {
return Point(x: -pt.x, y: -pt.y)
}
}
let p3 = -p1
p3.x // -12
p3.y // -34
extension Point { // c에서 주로 사용하는 증가 연산자
// postfix 후치 연산자로 선언된다. 연산도중 값이 변화하기 떄문에 입출력 파라미터로 선언해야한다.
static postfix func ++(pt : inout Point) -> Point {
let ret = pt
pt.x += 1
pt.y += 1
return ret
}
}
var p4 = Point(x: 1.0, y: 2.0)
let p5 = p4++
p5.x // 1
p5.y // 2 증가되지 않은 값이 저장되어있다.
p4.x // 2
p4.y // 3 증가되어있는 값으로 저장되어 있다.