[swift] 사용자 정의 객체를 정렬하기 위해 비교 함수 작성하기

Swift에서 사용자 정의 객체를 정렬하기 위해서는 비교 함수(comparison function)를 작성해야 합니다. 비교 함수를 작성하면 Swift 정렬 메서드를 사용하여 객체를 정렬할 수 있습니다.

비교 함수 작성하기

비교 함수를 작성하기 위해서는 Comparable 프로토콜을 준수하는 객체여야 합니다. Comparable 프로토콜은 객체 간에 크기 비교를 가능하게 해주는 프로토콜입니다. 사용자 정의 객체를 정렬하기 위해서는 객체에 Comparable 프로토콜을 채택하고, < 연산자를 구현해야 합니다.

struct Person: Comparable {
    let name: String
    let age: Int
    
    static func < (lhs: Person, rhs: Person) -> Bool {
        return lhs.age < rhs.age
    }
}

let person1 = Person(name: "John", age: 30)
let person2 = Person(name: "Jane", age: 25)
let person3 = Person(name: "Mike", age: 35)

let persons = [person1, person2, person3].sorted()
// [person2, person1, person3]

위의 예제에서 Person 구조체는 Comparable 프로토콜을 채택하고 < 연산자를 구현하여 age에 따라 크기 비교를 가능하게 합니다. persons 배열을 sorted() 메서드로 정렬하면 age를 기준으로 오름차순으로 정렬된 결과를 얻을 수 있습니다.

추가적인 비교 조건 적용하기

여러 개의 조건을 사용하여 정렬할 수도 있습니다. 이 경우, 비교 함수에서 추가적인 조건을 구현하면 됩니다.

struct Person: Comparable {
    let name: String
    let age: Int
    
    static func < (lhs: Person, rhs: Person) -> Bool {
        if lhs.age == rhs.age {
            return lhs.name < rhs.name
        }
        return lhs.age < rhs.age
    }
}

let person1 = Person(name: "John", age: 30)
let person2 = Person(name: "Jane", age: 25)
let person3 = Person(name: "Mike", age: 35)
let person4 = Person(name: "Jane", age: 30)

let persons = [person1, person2, person3, person4].sorted()
// [person2, person4, person1, person3]

위의 예제에서 name이 같은 경우 age로 비교하는 추가적인 조건을 구현했습니다. persons 배열을 sorted() 메서드로 정렬하면 age를 우선으로 오름차순으로 정렬되고, age가 같은 경우 name을 기준으로 정렬됩니다.

결론

Swift에서 사용자 정의 객체를 정렬하기 위해서는 비교 함수를 작성해야 합니다. Comparable 프로토콜을 채택하여 < 연산자를 구현하면 객체를 기준에 따라 정렬할 수 있습니다. 추가적인 비교 조건을 사용할 경우, 비교 함수에 조건을 추가하여 정렬하면 됩니다.