Notice
Recent Posts
Recent Comments
Link
슈프림 블로그
[Swift] 커스텀 객체 인스턴스를 비교하는 방법 본문
728x90
객체 인스턴스를 비교하는 방법
연산자 오버로딩
Swift에서는 기존 연산자에 새로운 기능을 할당하고 새로운 사용자 정의 연산을 만들 수 있다.
더하기 연산자 (+)
더하기 연산은 두 숫자를 덧셈한 값이나, 두 문자열을 연결한 값을 반환한다.
더하기 연산자를 사용하여 x
,y
좌표값을 갖는 Point
클래스를 더하는 기능을 만들 수 있을까?
class Point {
var x: Int
var y: Int
static func +(left: Point, right: Point) -> Point {
return Point(x: left.x+right.x, y: left.y+right.y)
}
var point1 = Point(x: 1, y:3)
var point2 = Point(x: 2, y:4)
print(point1 + point2) // Point(x: 3, y: 7)
Equatable, Comparable 준수
사용자 정의 연산자 오버로딩과 비슷하게 프로토콜 연산자를 반드시 오버로딩 해줘야 하는 경우도 있다.
객체가 서로 같음을 판별할 수 있음을 보장하는 Equatable
프로토콜은 반드시 ==
연산자를 오버로딩 해야 한다.
extension Point: Equatable {
static func ==(left: Point, right: Point) -> Bool {
return left.x == right.x && left.y == right.y
}
}
객체의 대소를 비교할 수 있음을 보장하는 Comparable
프로토콜은 반드시 <
연산자를 오버로딩 해야한다. Point
객체의 경우 y
값이 큰 객체가 큰 객체이고, y
값이 같을 경우 x
값이 큰 객체가 큰 객체라고 정의했다.
extension Point: Comparable {
static func <(left: Point, right: Point) -> Bool {
if left.y < right.y { return true }
return left.x < right.x
}
}
커스텀 클래스 객체 배열 정렬
커스텀 클래스로 정의된 객체의 배열이 있다면, 정렬하는 기준은 무엇일까?
배열의 sort() 함수
- 객체가 서로 비교연산을 진행했을 때, 큰 값 일 수록 뒤쪽으로 정렬되는 오름차순 정렬을 지원한다.
- 따라서
Comparable
프로토콜을 준수하는 객체라면 알아서 sorting 해준다!! - 내림차순으로 정렬하고 싶다면
sort()
함수를 사용한 뒤,reverse()
함수를 사용한다.
배열의 sorted() 함수
- 비교연산을 통해 오름차순 정렬되는 것은 동일하다.
- 하지만 원본배열이 수정되는 것이 아니라 새로운 정렬된 배열을 반환한다.
- 내림차순으로 정렬하고 싶은 경우
by:
인자에 원하는 비교 연산자를 넣어주면 된다.
points.sorted(by: >) // 내림차순 정렬
sorted()
를 사용할 때는Comparable
프로토콜을 준수하는 객체가 아니더라도 정렬하는 방법이 있다.
points.sorted(by: {$0.y < $1.y}) // y값이 적은 순으로 정렬하겠다는 뜻 (오름차순)
반응형
'iOS_Swift' 카테고리의 다른 글
[Swift] Closure 클로저가 도대체 뭔데? (0) | 2020.08.04 |
---|---|
[Swift] self, super 키워드 (0) | 2020.08.04 |
객체지향 프로그래밍에 대하여.. Class & Object & Instance (0) | 2020.08.04 |
[Swift] Any, AnyObject, nil (0) | 2020.04.25 |
[Swift] 기본 데이터 타입 (0) | 2020.04.25 |
Comments