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
끝!
# 참고한 사이트
'iOS > Swift 상식' 카테고리의 다른 글
Mutating (0) | 2023.03.04 |
---|---|
Hashable 및 Equatable을 상속 받아야 하는 이유 (0) | 2023.03.04 |
POP(Protocol Oriented Programming) vs OOP(Object Oriented Programming) (0) | 2023.02.21 |
프로토콜이란? (0) | 2023.02.21 |
멀티 스레드 구현시 고려해야할 것들 (0) | 2023.02.19 |