Menu
Coddy logo textTech

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"]
challenge icon

챌린지

쉬움

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) }
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: Swift 플레이그라운드