iOS/Swift 상식

Equatable 이란?

HJ39 2023. 3. 3. 21:42

Equatable는 예제를 통해 알아보면 쉽게 알 수 있다.

 

Swift의 기본 자료형 Bool , Int , UInt , Float , Double , Character , String , Any 들을 비교할 때 '=='을 사용하여 비교한다.

 

□ 자료형 Int를 비교하는 예시

let num1 = 1
let num2 = 3

num1 == num2

비교 연산자를 통해서 true, false를 얻을 수 있다.

 

하지만

 

구조체와 클래스를 비교하지 못한다.!!

왜냐하면 Swift의 기본 자료형들은 Equatable 프로토콜을 기본적으로 채택하지만 구조체와 클래스는 그러지 않기 때문!

 

구조체와 클래스에서 Equatable을 사용하기 위해서 프로토콜을 상속받으면 된다.

 

struct Human : Equatable{
    let name: String
    let age: Int
}

let h1 = Human(name: "", age: 10)
let h2 = Human(name: "a", age: 2)
let h3 = Human(name: "", age: 10)

h1 == h2	//false
h1 == h3	//true

struct 내부의 타입이 기본타입인 경우 protocol 내부 메서드를 구현하지 않아도 사용 가능 하다.

 

Protocol 내부 메서드를 구현하는 경우 특정 변수에 대해 비교할 수 있다.

struct Human : Equatable{
    let name: String
    let age: Int
    
    static func == (first: Self, second: Self) -> Bool {
        return first.name == first.name
    }
}

let h1 = Human(name: "", age: 10)
let h2 = Human(name: "a", age: 2)
let h3 = Human(name: "", age: 10)

h1 == h2	//true
h1 == h3	//true

 

클래스는 구조체와 약간 다르다.

구조체의 경우 == 메서드를 구현하지 않아도 사용할 수 있었지만 클래스는 사용할 수 없다.

(무조건 구현해야 한다)

 

class Animal: Equatable{
    var name: String = ""
    let age: Int = 0
    
    static func == (lhs: Animal, rhs: Animal) -> Bool {
        return lhs.name == rhs.name
    }
}

let a1 = Animal.init()
let a2 = Animal.init()

a1 == a2	//true
a2.name = "A"
a1 == a2	//false

끝!

 

# 참고한 사이트

  1. https://babbab2.tistory.com/148