Comparable
Coddy Swift 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 39번째.
Comparable는 타입에 <, <=, > 및 >= 연산자를 제공합니다. <만 구현하면 되며, Swift가 나머지를 파생합니다. Comparable 타입은 sorted()로 정렬할 수 있고 min() 및 max()와 함께 사용할 수 있습니다:
struct Version: Comparable {
let major: Int, minor: Int
static func < (lhs: Version, rhs: Version) -> Bool {
(lhs.major, lhs.minor) < (rhs.major, rhs.minor)
}
}
let versions = [Version(major: 2, minor: 1), Version(major: 1, minor: 9), Version(major: 2, minor: 0)]
let newest = versions.max()!
print("\(newest.major).\(newest.minor)")
print(versions.sorted().map { "\($0.major).\($0.minor)" })출력:
2.1
["1.9", "2.0", "2.1"]튜플을 비교하면 구성 요소가 순서대로 비교되므로 다중 키 비교를 간결하게 작성할 수 있습니다. 여기서는 먼저 우선순위로 정렬한 다음 이름으로 정렬합니다:
struct Task: Comparable {
let priority: Int
let name: String
static func < (lhs: Task, rhs: Task) -> Bool {
(lhs.priority, lhs.name) < (rhs.priority, rhs.name)
}
}
let tasks = [Task(priority: 2, name: "email"), Task(priority: 1, name: "fix"), Task(priority: 2, name: "call")]
print(tasks.sorted().map { $0.name })출력:
["fix", "call", "email"]연관된 값이 없는 열거형은 <를 작성하지 않고도 Comparable을 준수할 수 있습니다. 케이스는 선언된 순서대로 비교됩니다:
enum Priority: Comparable {
case low, medium, high
}
print(Priority.low < Priority.high)
print([Priority.high, .low, .medium].sorted())출력:
true
[main.Priority.low, main.Priority.medium, main.Priority.high]sorted(by:)는 한 번의 호출에서 어떤 규칙으로든 정렬하는 반면, Comparable은 sorted(), min(), max()가 어디서나 사용하는 타입의 자연 순서를 정의합니다:
struct Task: Comparable {
let priority: Int
let name: String
static func < (lhs: Task, rhs: Task) -> Bool { lhs.priority < rhs.priority }
}
let tasks = [Task(priority: 3, name: "c"), Task(priority: 1, name: "a")]
print(tasks.sorted().map { $0.name })
print(tasks.sorted(by: >).map { $0.name })출력:
["a", "c"]
["c", "a"]챌린지
쉬움Runner를 (이름과 minutes, seconds로 나타낸 완주 시간) Comparable을 준수하도록 만드세요. 더 빠른 시간이 더 작은 값이 되며, 시간이 같으면 이름순으로 정렬합니다. podium(_:)을 완성하세요. 이 함수는 sorted()로 주자들을 정렬하고, 상위 3명에 대해 초를 두 자리로 맞춘 1. Ada 20:05 형식의 줄을 반환해야 합니다(주자가 3명보다 적으면 그만큼만 반환).
제공된 코드는 name,mm:ss 형식의 줄을 읽고 반환된 각 줄을 출력합니다.
코드는 Runner.swift와 Functions.swift에 작성하세요. main.swift에는 제공된 입력/출력 코드가 들어 있으며 수정할 수 없습니다.
직접 해보기
// 제공된 입력/출력 코드: 그대로 유지하세요
var input: [String] = []
while let line = readLine() { input.append(line) }
let runners = input.map { line -> Runner in
let p = line.split(separator: ",").map(String.init)
let t = p[1].split(separator: ":").map { Int($0)! }
return Runner(name: p[0], minutes: t[0], seconds: t[1])
}
for line in podium(runners) { print(line) }
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: Swift 플레이그라운드