값의 크기 또는 순서를 비교를 위해 채택
채택 시 필수적으로 less than 연산자 <
를 구현
필수구현 예외: enum의 경우 연관값 존재여부 무관, 원시값이 미존재 시
less than 연산자는 자동 제공
(원시값 존재 시
개발자가 값을 제공하므로 정렬방식도 구현 필요
enum YoondsCount: Int {
case one = 0
case two
case three
case four
}
extension YoondsCount: Comparable {
// 원시값 존재하지 않을경우 생략 가능
static func < (lhs: YoondsCount, rhs: YoondsCount) -> Bool {
return lhs.rawValue < rhs.rawValue
}
}
YoondsCount.one > YoondsCount.two // false
YoondsCount.two > YoondsCount.one // true
YoondsCount.two == YoondsCount.one // false
struct Man {
var name: String
var age: Int
}
extension Man: Comparable {
static func < (lhs: Man, rhs: Man) -> Bool {
return lhs.age < rhs.age // 어떤값을 비교할지 구현 - age
}
}
let man1: Man = Man(name: "Yoonds", age: 25)
let man2: Man = Man(name: "Minsu", age: 21)
man1 < man2 // false
man1 > man2 // true
man1 == man2 // false
<
연산자에 직접 구현 필요(name - 글자순서 또는 age)==
연산자도 구현없이 사용class Man {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
extension Man: Comparable {
static func ==(lhs: Man, rhs: Man) -> Bool {
return lhs.name == rhs.name && lhs.age == rhs.age
}
static func < (lhs: Man, rhs: Man) -> Bool {
return lhs.age < rhs.age
}
}
let man1: Man = Man(name: "Yoonds", age: 25)
let man2: Man = Man(name: "Minsu", age: 21)
man1 < man2
man1 > man2
man1 == man2
==, <
두 연산자 구현 필요