직접 정의한 클래스의 인스턴스끼리 비교할 때는 ==
가 기본적으로는 구현이 되어 있지 않기 때문에 사용할 수 없습니다. ==
를 사용하려면 Equatable
프로토콜을 채택하여 ==
에 대해 정의해 주어야 하는데요.
switch문은 ==
비교인데..
그런데 입력된 UIButton
이 어떤 버튼인지 확인 하기 위해서 switch문을 사용하여 비교가 되잖아요..?
그럼 UIButton에 어떤 것이 ==
비교를 가능하게 했을까 확인해보았습니다.
UIButton에는 해당하는 ==
메서드가 없는 것 같아 UIButton
의 부모클래스인 UIControl
을 보고 UIView
를 보아도 없었어요. 그래서 계속 들어가 보니 NSObject
통해 ==
연산이 가능하다는 것을 알게되었습니다.
NSObject
의 isEqual
메서드를 통해 ==
비교가 가능하게 된다는 것을 알게 되었습니다.테스트를 해보겠습니다.
class Test: NSObject {
var title: String
var author: String
init(title: String, author: String) {
self.title = title
self.author = author
}
override func isEqual(_ object: Any?) -> Bool {
print(#function, "called")
if let other = object as? Test {
return self.title == other.title
} else {
return false
}
}
}
let test1 = Test(title: "title", author: "title")
let test2 = Test(title: "title", author: "title")
print(test1 == test2)
Test
클래스가 NSObject
를 상속하도록 하고 isEqual
메서드를 override
하여 재정의 했습니다.
그리고 ==
를 사용하여 비교를 해보았는데. 결과는 아래와 같이 나왔습니다.
isEqual(_:) called
true
==
비교를 할 때에 isEqual
메서드가 호출이 된다는 것을 알 수 있습니다.
그래서 UIButton에서도 ==
비교를 사용할 수 있었습니다.
같은 방식으로 NSObject를 조상클래스..?(부모의부모의부모의...)로 두고 있는 클래스는 ==
비교를 할 수 있겠네요!