직접 정의한 클래스의 인스턴스끼리 비교할 때는 ==가 기본적으로는 구현이 되어 있지 않기 때문에 사용할 수 없습니다. == 를 사용하려면 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를 조상클래스..?(부모의부모의부모의...)로 두고 있는 클래스는 ==비교를 할 수 있겠네요!