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"]Tantangan
MudahBuat 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) }
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Class dan Object
Bekerja dengan FileMendefinisikan ClassMethod dan selfInitializerClass adalah ReferensiUlasan: Kartu Perpustakaan4Enkapsulasi
Kontrol AksesHanya Bisa Dibaca dari LuarMelindungi StateInitializer yang Bisa GagalRangkuman: Rekening Bank7Polimorfisme dan Generik
PolimorfismeKonversi TipeFungsi GenerikTipe GenerikRangkuman: Kalkulator Bentuk2Struct dan Tipe Nilai
StructSemantik NilaiMethod yang Mengubah NilaiStruct atau classRangkuman, Item Inventaris11Proyek: Manajemen Perpustakaan
Buku dan AnggotaPeminjaman BukuLatihan sendiri: Playground Swift