스위프트에서 == 연산자는 두 값의 동등성을 검사하는 데 사용됩니다. 이 연산자를 사용자 정의 타입에 사용하려면 타입이 Equatable 프로토콜을 준수해야 하며, 정적 함수 ==를 구현해야 합니다.
구현은 대칭적이고 전이적이어야 합니다. 예:
struct Person: Equatable { let name: String let age: Int static func ==(lhs: Person, rhs: Person) -> Bool { return lhs.name == rhs.name && lhs.age == rhs.age } }
타입이 ==를 구현하지 않으면, 그러한 인스턴스 간의 비교 시 컴파일 오류가 발생할 수 있습니다.
질문: 구조체나 클래스가 Equatable 프로토콜을 상속하는 경우, 왜 가끔 == 연산자를 명시적으로 구현할 필요가 없을까요?
답변: 모든 속성이 Equatable을 준수하는 구조체의 경우, 스위프트는 자동으로 == 연산자 구현을 합성합니다. 그러나 타입에 Equatable이 아닌 속성이 있거나 클래스가 커스텀 상속을 가진 경우, 합성이 이루어지지 않으며 수동으로 연산자를 구현해야 합니다.
struct Point: Equatable { var x: Int var y: Int // ==의 구현이 필요하지 않으며, 자동으로 합성됩니다. }
이야기
한 프로젝트에서 개발자가
Equatable을 준수하는 구조체에UIImage타입의 속성을 추가했습니다.UIImage가Equatable을 구현하지 않기 때문에 컴파일 오류가 발생했습니다. 해결책은 연산자==를 수동으로 구현하고, 논리에 중요한 속성만 비교하는 것입니다.
이야기
새로운 속성을 구조체에 추가한 후 사용자 정의 연산자
==에 그 비교를 추가하는 것을 잊어버려 오류가 발생했습니다. 이는 컬렉션 작업 시 논리에 잘못된 영향을 미치고 사용자 필터에서 버그를 발생시켰습니다.
이야기
프로젝트에서
Equatable을 구현하지 않은 커스텀 클래스를 작성했지만, 이를 Set에서 사용하려고 했습니다. 이로 인해 runtime 오류가 발생했으며, Set은 요소가 고유해야 한다고 요구합니다 (따라서Equatable이 필요합니다).