연산자 오버로딩은 사용자 정의 타입에 대해 표준(및 사용자 정의) 연산자의 동작을 정의하거나 재정의할 수 있는 기능입니다. 이를 통해 구조체 및 클래스와 함께 하는 작업에서 더 표현력 있는 작성을 가능하게 합니다.
특징:
static func 키워드를 사용하여 전역 범위에서 필수적으로 operator 수정자와 함께 정의됩니다.Equatable, Comparable 등)을 준수해야 합니다.infix, prefix, postfix 형식의 사용자 정의 연산자를 생성할 수 있습니다.예시:
struct Vector2D { var x: Double var y: Double static func +(lhs: Vector2D, rhs: Vector2D) -> Vector2D { return Vector2D(x: lhs.x + rhs.x, y: lhs.y + rhs.y) } } let a = Vector2D(x: 1, y: 2) let b = Vector2D(x: 3, y: 4) let sum = a + b // Vector2D(x: 4, y: 6)
주요 사항:
ExpressibleByBooleanLiteral, BooleanType)을 준수해야 합니다.precedence group)를 지정해야 합니다.클래스 객체로 작업하기 위해 +와 같은 표준 연산자를 오버로딩할 수 있나요? 그리고 ==를 통해 사용자 정의 구조체 비교를 구현하려면 무엇이 필요합니까?
답변: 네, 표준 연산자(예: +, ==, <)는 사용자 정의 구조체 및 클래스에 대해 오버로딩할 수 있습니다. ==를 통해 구조체/클래스를 비교하기 위해서는 해당 타입이 Equatable 프로토콜을 준수하고 정적 함수 equality를 구현해야 합니다:
예시:
struct Point: Equatable { let x: Int let y: Int static func ==(lhs: Point, rhs: Point) -> Bool { return lhs.x == rhs.x && lhs.y == rhs.y } }
이야기
구조체에 대해 == 연산자를 재정의했지만 hash(into:)를 구현하지 않아 이 타입을 Set 또는 사전의 키로 사용했을 경우, 동일한 요소가 집합에 두 번 들어가거나 찾을 수 없는 결과가 발생했습니다. 이는 표준 Hashable 메커니즘을 위반한 것입니다.
이야기
우선순위 그룹을 지정하지 않고 사용자 정의 infix 연산자를 생성했습니다. 이로 인해 연산자가 비논리적인 결합 법칙에 따라 예상치 못한 방식으로 작동하여 복잡한 표현식에서 오류가 발생했습니다.
이야기
프로젝트에서 모델 병합을 위한 | 연산자를 도입했지만, 초보자들이 이 연산자를 비트 OR 연산자로 종종 혼동하여 데이터 처리에서 혼란과 잘못된 부울 플래그 검사를 초래했습니다.