sorted(by:)
Coddy Swift 여정의 로직 및 흐름 섹션에 포함된 레슨 — 56개 중 30번째.
숫자나 문자열과 같은 Comparable 값의 배열에서 .sorted()를 사용해 보셨을 것입니다. 다른 기준으로 정렬하고 싶을 때는, 두 개의 요소를 받아서 첫 번째 요소가 두 번째 요소보다 앞에 와야 할 때 true를 반환하는 클로저를 제공하세요.
let words = ["banana", "hi", "hello"]
let byLength = words.sorted { $0.count < $1.count }
print(byLength) // ["hi", "hello", "banana"]내림차순의 경우, 비교 연산자를 바꾸세요:
let down = words.sorted { $0.count > $1.count }
print(down) // ["banana", "hello", "hi"]클로저는 파생된 값, 길이, 마지막 글자, 해시의 항목 등 무엇이든 비교할 수 있습니다. 클로저가 무엇을 비교하느냐에 따라 정렬 방식이 결정됩니다.
min(by:)와 max(by:)도 같은 방식으로 작동하지만, 정렬된 복사본 대신 단일 옵셔널 요소를 반환합니다.
챌린지
중급한 줄의 입력을 읽습니다: 쉼표로 구분된 name:age 쌍의 목록입니다.
세 줄을 출력합니다:
- 나이순으로 오름차순 정렬된 이름들을
,로 연결하여 출력합니다. 나이가 같을 경우 이름의 알파벳 순으로 정렬합니다. - 가장 나이가 많은 사람의 이름 (
max(by:)를 사용하세요). 동률일 경우, 먼저 나타나는 사람이 선택됩니다. - 가장 나이가 적은 사람의 이름 (
min(by:)를 사용하세요). 동률일 경우, 먼저 나타나는 사람이 선택됩니다.
입력이 alice:30,bob:22,cara:30,dan:18일 때, 출력은 다음과 같습니다:
dan,bob,alice,cara
alice
dan치트 시트
파생된 값을 기준으로 정렬하려면 커스텀 클로저와 함께 .sorted { }를 사용하세요. 클로저는 두 개의 요소를 인자로 받으며, 첫 번째 요소가 두 번째 요소보다 앞에 와야 할 때 true를 반환합니다:
let words = ["banana", "hi", "hello"]
let byLength = words.sorted { $0.count < $1.count }
// ["hi", "hello", "banana"]내림차순 정렬의 경우, 연산자를 바꿉니다:
let down = words.sorted { $0.count > $1.count }
// ["banana", "hello", "hi"]min(by:)와 max(by:)는 동일한 클로저 시그니처를 사용하지만, 단일 옵셔널 요소를 반환합니다:
let longest = words.max(by: { $0.count < $1.count }) // "banana"
let shortest = words.min(by: { $0.count < $1.count }) // "hi"직접 해보기
let people = readLine()!.components(separatedBy: ",").map { pair -> (String, Int) in
let parts = pair.components(separatedBy: ":")
return (parts[0], Int(parts[1])!)
}
// TODO: 나이 오름차순으로 정렬(동일 시 이름순); max(by:)로 최고령자 찾기; min(by:)로 최연소자 찾기
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.