Do.

Swift - 연산자 메소드와 커스텀 연산자 본문

iOS

Swift - 연산자 메소드와 커스텀 연산자

Hey_Hen 2022. 2. 9. 15:37

(네이버 블로그에서 이전 중입니다)

 

Swift 공부중에 C++ 처럼 연산자 오버로딩과 커스텀 연산자 사용이 가능하다는 것을 알았다. Cpp 보다 훨씬 쉽고 편하게 (swift 전체가 그렇지만) 사용할 수 있다는 것을 알았다.

(C++의 연산자 오버로딩 과 Swift 의 연산자 메소드과 완벽히 치환되는 기능인지는 아직 잘 모르겠다)

https://docs.swift.org/swift-book/LanguageGuide/AdvancedOperators.html

Swift org에서 언어 가이드의 고-급 연산자 (가장 아래에 있더라)에서 찾을 수 있다.

연산자 중복은 Operator Methods 라는 명칭으로 제공되며 다음과 같이 사용할 수 있다.

Coord2D 라는 구조체가 있을 때 서로 다른 Coord2D 객체를 더하는 함수 메소드 이다.

기본적인 형식은 구조체를 extension 하여 아래와 같이 구현하면 된다.

static func operator(param) -> return {
    //code
}
 

위 기본 형식을 통해 아래와 같이 구현할 수 있다.

struct Coord2D {
    var x = 0
    var y = 0
}

extension Coord2D {
    static func + (lhs: Coord2D, rhs: Coord2D) -> Coord2D {
        return Coord2D(x: lhs.x + rhs.x, y: lhs.y + rhs.y)
    }
}

let coord1 = Coord2D(x: 3, y: 4)
let coord2 = Coord2D(x: 5, y: 1)

coord1 + coord2
//Coord2D(x: 8, y: 6)

또 구조체 끼리 만약 Bool 값을 리턴하는 식 그러니까 비교연산 을 한다고 하면 일일이 코드를 써서 구현해줄 필요가 없다.Equivalence Operators 라는 것인데 Equatable 이라는 Protocol 로 아래와 같이 사용하면 구현할 필요 없이 사용할 수 있다.

extension Coord2D: Equtable {
    static func + (lhs: Coord2D, rhs: Coord2D) -> Coord2D {
        return Coord2D(x: lhs.x + rhs.x, y: lhs.y + rhs.y)
    }
}

coord1 == coord2 //false

먼저 사용했던 연산자 메소드에 바로 Equtable Protocol 을 선언했고 별다른 구현없이 coord1과 coord2 를 비교하는 연산자를 사용 가능하다.

이러한 사용 방법 외에도 연산자를 앞에 붙이냐 뒤에 붙이냐 즉 Prefix 와 Postfix를 통해 C에서 처럼 변수의 값을 1 증가 시키는 ++ 연산자를 구현할 수 있다.

Swift에서는 Int 자료형 또한 구조체로 구현되어 있기 때문에 아래와 같이 Operator Method 를 구현할 수 있다.

 
extension Int {
    static prefix func ++(input: inout Int) {
        input += 1
    }
}

var val = 3
++val //val = 4

++param 식으로 사용할 것이기 때문에 위와 같은 형태를 따른다

만약 인수에서 inout 을 선언하지 않으면 인수를 상수로 보기 때문에 수정이 불가 하니 inout 을 추가로 명시한다.

param++ 식으로 사용할 거라면 아래와 같이 선언할 수 있겠다

 
extension Int {
    static prefix func ++(input: inout Int) {
        input += 1
    }
    static postfix func ++(input: inout Int) -> Int {
        let retN = input
        input += 1
        return retN
    }
}

이외에도 커스텀 연산자 예를들어 +++ 를하면 더하기 2를 한다던가 하는 연산자도 사용할 수 있다.

Custom Operators 로 Swift.org 같은 문서에 적용되어 있고 사용방법이 99% 동일하니 생.략

Comments