Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
반응형
Archives
Today
Total
관리 메뉴

슈프림 블로그

[Swift] 커스텀 객체 인스턴스를 비교하는 방법 본문

iOS_Swift

[Swift] 커스텀 객체 인스턴스를 비교하는 방법

_슈프림 2020. 8. 4. 09:38
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값이 적은 순으로 정렬하겠다는 뜻 (오름차순)
반응형
Comments