스위프트에서 연산자 함수는 표준 연산자(+, -, *, ==, < 등)를 구현하거나 재정의할 수 있는 기능이며, 사용자 정의 연산자(예: %% 또는 <|>)를 생성할 수도 있습니다. 이를 위해 함수 선언에 operator 키워드를 사용합니다. 일반적으로 연산자는 자신의 타입에 대해 구문적으로 편리하고 직관적으로 만들기 위해 오버로드됩니다.
Vector2D 구조체에 대한 더하기 오버로드 예:
struct Vector2D { var x: Double var y: Double } func + (lhs: Vector2D, rhs: Vector2D) -> Vector2D { return Vector2D(x: lhs.x + rhs.x, y: lhs.y + rhs.y) } let v1 = Vector2D(x: 1, y: 2) let v2 = Vector2D(x: 3, y: 4) let sum = v1 + v2 // Vector2D(x: 4, y: 6)
제한사항:
+*-/&|^%~!=<>.?)만 사용하여 생성할 수 있습니다.표준 타입에 대해 연산자를 오버로드하여 예를 들어 Int에 대한 +의 의미를 변경할 수 있습니까?
답변: 아닙니다, 스위프트에서는 표준 타입에 대한 연산자의 전역 동작을 재정의할 수 없으며, 사용자 정의 타입이나 특정 조합에 대해서만 확장할 수 있습니다. 예를 들어:
// 오류: Int에 대한 오버로드는 기존 의미를 변경하지 않습니다. func + (lhs: Int, rhs: Int) -> Int { return lhs - rhs // 작동하지 않음: 기존 동작과 충돌 발생 }
이야기
프로젝트에서 자신만의 연산자 **(거듭제곱)이 생성되었으나 잘못된 우선 순위가 포함되어 2 + 3 ** 2와 같은 표현식의 잘못된 계산으로 이어졌습니다. 결과: 잘못된 결과, 디버깅이 어려운 버그.
이야기
내부 API가 있는 모듈에서 사용자 정의 타입에 대해 ==를 오버로드했지만 해싱(Hashable)을 구현하지 않아 Set 및 Dictionary 컬렉션에서 인스턴스가 논리적 동등성에 따라 서로 다르게 간주되는 문제가 발생했습니다.
이야기
사용자 정의 연산자를 생성할 때 사용자가 그의 의미에 대해 문서화하는 것을 잊었습니다. 새로운 개발자가 연산자의 의미를 잘못 이해하고 부적절한 데이터에 적용하여 비즈니스 로직에서 추적하기 어려운 논리적 오류가 발생했습니다.