참고로 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 |