본문 바로가기
iOS/Swift

[Swift] sorted(by:) 메서드와 클로저

by 최지철 2024. 10. 13.
반응형

sorted(by:) 메서드란?

sorted(by:) 메서드는 Swift에서 배열을 특정 기준에 따라 정렬할 때 사용하는 함수입니다.

이 메서드는 배열의 요소들을 비교하여 새로운 정렬된 배열을 반환합니다. 원본 배열은 변경되지 않습니다.

 

기본 sorted()

let numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5]
let sortedNumbers = numbers.sorted()
print(sortedNumbers) // 출력: [1, 1, 2, 3, 4, 5, 5, 6, 9]

sorted() 메서드는 배열을 오름차순으로 정렬합니다. 하지만, sorted(by:) 메서드를 사용하면 커스텀 정렬 기준을 제공할 수 있습니다.

 

sorted(by:)의 시그니처

func sorted(by areInIncreasingOrder: (Element, Element) -> Bool) -> [Element]
  • 매개변수: areInIncreasingOrder는 두 요소를 비교하는 클로저로, 첫 번째 요소가 두 번째 요소보다 먼저 와야 하는지를 결정합니다.
  • 반환값: 정렬된 새로운 배열을 반환합니다.

 

sorted(by:)와 클로저의 결합

예제) 내림차순

let numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5]
let sortedNumbers = numbers.sorted { (a, b) -> Bool in
    return a > b
}
print(sortedNumbers) // 출력: [9, 6, 5, 5, 4, 3, 2, 1, 1]

 

a와 b의 역할:

  • 비교 대상: 클로저는 두 개의 요소 a와 b를 비교하여, a가 b보다 먼저 와야 하는지 여부를 판단합니다.
  • 순서 결정: 클로저가 true를 반환하면 a가 b보다 먼저 오도록 배열을 재배열합니다. false를 반환하면 b가 a보다 먼저 옵니다.

예제)복잡한 정렬 기준

struct Person {
    let name: String
    let age: Int
}

let people = [
    Person(name: "Alice", age: 30),
    Person(name: "Bob", age: 25),
    Person(name: "Charlie", age: 35)
]

let sortedPeople = people.sorted { (a, b) -> Bool in
    if a.age != b.age {
        return a.age < b.age
    } else {
        return a.name < b.name
    }
}

for person in sortedPeople {
    print("\(person.name), \(person.age)")
}
// 출력:
// Bob, 25
// Alice, 30
// Charlie, 35

나이를 기준으로 오름차순 정렬하고, 나이가 같을 경우 이름을 기준으로 오름차순 정렬합니다.

 

클로저의 간결한 작성

// 기존 방식
let sortedNumbers = stringNumbers.sorted { (a, b) -> Bool in
    return a + b > b + a
}

// 축약된 방식
let sortedNumbers = stringNumbers.sorted { $0 + $1 > $1 + $0 }

다양한 정렬 기준 적용

클로저를 사용하면 다양한 정렬 기준을 쉽게 적용할 수 있습니다. 예를 들어, 문자열의 길이 기준으로 정렬하거나, 사용자 정의 객체의 특정 속성을 기준으로 정렬할 수 있습니다.

let strings = ["apple", "banana", "cherry", "date"]

// 문자열 길이 기준 오름차순 정렬
let sortedByLength = strings.sorted { $0.count < $1.count }
print(sortedByLength) // 출력: ["date", "apple", "banana", "cherry"]
반응형