본문 바로가기
🌱

Equatable

by 방우 2022. 8. 18.

참고로 lhs, rhs 의미는 검색하면 정말 잘 나와있다. 내가 이해한 바로는 매개변수 자리에 대한 의미 정도?

 

Equatable

 

Equatable은 타입끼리 비교(==)연산을 하기 위해서 필수적으로 구현해야하는 프로토콜

  • Int, String끼리는 비교가 되는데 왜 구조체, 클래스 인스턴스끼리 비교가 안 될까?
struct Human {

var name = ""
var age = 0

}

let human1 = Human.init()
let human2 = Human.init()

human1 == human2 // Binary operator '==' cannot be applied to two 'Human' operands 라는 오류가 뜸
  • => Int, Double, String은 가장 기본적인 자료형으로, Epuatable이란 프로토콜이 이미 모두 채택되어 컴파일러가 자동으로 구현해주기 때문이다.
public protocol Epuatable {
static func == (lhs: Self, rhs: Self) -> Bool
}
  • 타입끼리 ==을 쓰기 위해서 필수적으로 채택해야 하는 것이 Equatable이란 프로토콜이다.
  • 채택하고 나서 위의 메서드를 구현 해야줘야 한다.

사용하는 방법 - struct

struct Human: Equatable {
var name = ""
var age = 0
}

let human1 = Human.init()
let human2 = Human.init(name: "", age: 18)

print(human1 == human2) // false
  • 이렇게 Human 구조체에 Equatable 프로토콜을 채택해주면, 인스턴스끼리 비교가 가능해짐
  • 프로토콜 내 정의되어 있는 == 메서드를 구현해주지 않아도 타입 내 프로퍼티의 기본 타입이 (name: String, age: Int)라면,  Equatable을 채택하는 것만으로도 사용가능
  • 이렇게 직접 메서드를 구현해주지 않을 때,  인스턴스의 프로퍼티 요소의 값이 모두 같아야 참이 나옴
struct Human: Equatable {
var name = ""
var age = 0

static func == (lhs: Self, rhs: Self) -> Bool {
return lhs.name == rhs.name
}
}

let human1 = Human.init()
let human2 = Human.init(name: "", age: 18)

print(human1 == human2) // true
  • 만약 이렇게 직접 구현해주면, name에 한해서만 비교를 하기 때문에 human1과 human2의 이름이 같으면 age가 달라도 같은 인스턴스로 인식한다.

사용하는 방법 - class

  • 클래스의 경우 Equatable을 채택하는 것만으로 자동 구현해주지 않음. 직접 == 메서드를 구현해야함
class Human: Equatable {

var name = ""
var age = 0
}
//Type 'Human' does not conform to protocol 'Equatable -> 이렇게 오류남
class Human {

var name = ""
var age = 0
}

extension Human: Equatable {

static func == (lhs: Human, rhs: Human) -> Bool {

return lhs.name == rhs.name && lhs.age == rhs.age
}
}

let human1 = Human.init()
let human2 = Human.init()
human2.age = 12

print(human1 == human2) // false

사용하는 방법 - 열거형

연관값이 없는 열거형

  • Equatable을 채택하지 않아도 자동 구현됨
enum Gender {
case male
}

let man = Gender.male
let man2 = Gender.male

man == man2 //true

 

연관값이 있는 열거형

  • Equtable을 채택만 해줘도 자동 구현됨
  • 채택은 필수지만 ==메서드 구현 필수가 아님
enum Gender: Equatable {
case male(name: String)
}
let man = Gender.male(name: "bang")
let man2 = Gender.male(name: "woo")
print(man == man2) // false

 


 

노션에 정리해놨었던걸 블로그에 옮겼는데 출처가 없다....비슷한 블로그 글 있다면 알려주세요...

'🌱' 카테고리의 다른 글

Closure 1/3  (0) 2022.10.28
값전달 - 클로저 트러블 슈팅  (0) 2022.08.19
forEach와 for_in 차이  (0) 2022.08.17
UIButtonConfiguration  (0) 2022.08.15
Dynamic Type  (0) 2022.08.15