Menu
CoddyTech

Comparable

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Swift di Coddy. Pelajaran 39 dari 57.

Comparable memberikan tipe operator <, <=, > dan >=. Kamu hanya perlu mengimplementasikan <; Swift akan menurunkan sisanya. Tipe Comparable dapat diurutkan dengan sorted() dan digunakan dengan min() serta 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)" })

Output:

2.1
["1.9", "2.0", "2.1"]

Membandingkan tuple akan membandingkan bagian-bagiannya secara berurutan, sehingga perbandingan dengan beberapa kunci menjadi singkat. Di sini, tugas diurutkan berdasarkan prioritas terlebih dahulu, lalu berdasarkan nama:

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 })

Output:

["fix", "call", "email"]

Enum tanpa nilai terkait dapat mengadopsi Comparable tanpa menulis <: kasus dibandingkan berdasarkan urutan deklarasinya:

enum Priority: Comparable {
    case low, medium, high
}

print(Priority.low < Priority.high)
print([Priority.high, .low, .medium].sorted())

Output:

true
[main.Priority.low, main.Priority.medium, main.Priority.high]

sorted(by:) mengurutkan dengan aturan apa pun untuk satu pemanggilan, sedangkan Comparable menentukan urutan alami tipe yang digunakan oleh sorted(), min(), dan max() di mana pun:

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 })

Output:

["a", "c"]
["c", "a"]
challenge icon

Tantangan

Mudah

Buat Runner (nama dan waktu finis sebagai minutes, seconds) memenuhi Comparable, dengan waktu yang lebih cepat bernilai lebih kecil dan waktu yang sama diurutkan berdasarkan nama. Lengkapi podium(_:), yang mengurutkan para pelari dengan sorted() dan mengembalikan baris 1. Ada 20:05 untuk tiga pelari pertama (lebih sedikit jika jumlah pelari kurang dari tiga), dengan detik ditulis dalam dua digit.

Kode yang disediakan membaca baris name,mm:ss dan mencetak setiap baris yang dikembalikan.

Tulis kodemu di Runner.swift dan Functions.swift. main.swift berisi kode input/output yang disediakan dan tidak boleh diedit.

Coba sendiri

// Kode input/output yang disediakan: biarkan apa adanya
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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Playground Swift