NSObject - isEqual

hoBahk·2021년 11월 3일
1

NSObject - isEqual

직접 정의한 클래스의 인스턴스끼리 비교할 때는 ==가 기본적으로는 구현이 되어 있지 않기 때문에 사용할 수 없습니다. == 를 사용하려면 Equatable 프로토콜을 채택하여 ==에 대해 정의해 주어야 하는데요.

switch문은 == 비교인데..
그런데 입력된 UIButton이 어떤 버튼인지 확인 하기 위해서 switch문을 사용하여 비교가 되잖아요..?

그럼 UIButton에 어떤 것이 == 비교를 가능하게 했을까 확인해보았습니다.
UIButton에는 해당하는 ==메서드가 없는 것 같아 UIButton의 부모클래스인 UIControl을 보고 UIView를 보아도 없었어요. 그래서 계속 들어가 보니 NSObject 통해 ==연산이 가능하다는 것을 알게되었습니다.

UIButton > UIControl > UIView > UIResponder > NSObject

NSObjectisEqual메서드를 통해 == 비교가 가능하게 된다는 것을 알게 되었습니다.

테스트를 해보겠습니다.

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를 조상클래스..?(부모의부모의부모의...)로 두고 있는 클래스는 ==비교를 할 수 있겠네요!

profile
호박에 줄 그어서 수박 되는 성장 드라마

0개의 댓글