Comparable
Coddy'nin Swift Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 39 / 57.
Comparable bir türe <, <=, > ve >= operatörlerini kazandırır. Yalnızca < operatörünü uygularsınız; Swift geri kalanını türetir. Comparable türleri sorted() ile sıralanabilir ve min() ile max() ile kullanılabilir:
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)" })Çıktı:
2.1
["1.9", "2.0", "2.1"]Tuple'ları parçalarını sırayla karşılaştırır; bu da çok anahtarlı karşılaştırmaları kısaltır. Burada görevler önce önceliğe, ardından ada göre sıralanır:
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 })Çıktı:
["fix", "call", "email"]İlişkili değerleri olmayan enum'lar, < yazmadan Comparable protokolüne uyabilir: durumlar, bildirildikleri sıraya göre karşılaştırılır:
enum Priority: Comparable {
case low, medium, high
}
print(Priority.low < Priority.high)
print([Priority.high, .low, .medium].sorted())Çıktı:
true
[main.Priority.low, main.Priority.medium, main.Priority.high]sorted(by:) tek bir çağrı için herhangi bir kuralla sıralama yaparken, Comparable türün sorted(), min() ve max() tarafından her yerde kullanılan doğal sıralamasını tanımlar:
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 })Çıktı:
["a", "c"]
["c", "a"]Görev
KolayRunner türünü (ad ve minutes, seconds olarak bitirme süresi) Comparable ile uyumlu hale getirin; daha hızlı süre daha küçük olmalı ve eşit süreler ada göre sıralanmalıdır. Koşucuları sorted() ile sıralayan ve ilk üçü için (koşucu sayısı daha azsa daha az satır) saniyeleri iki basamağa tamamlayarak 1. Ada 20:05 satırlarını döndüren podium(_:) işlevini tamamlayın.
Sağlanan kod, name,mm:ss biçimindeki satırları okur ve döndürülen her satırı yazdırır.
Kodunuz Runner.swift ve Functions.swift dosyalarına yazılmalıdır. main.swift, sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
// Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
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) }
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Sınıflar ve Nesneler
Dosyalarla ÇalışmaSınıfları TanımlamaMetotlar ve selfBaşlatıcılarSınıflar ReferanstırTekrar - Kütüphane Kartı4Kapsülleme
Erişim DenetimiDışarıdan Salt OkunurDurumu KorumaBaşarısız Olabilen BaşlatıcılarTekrar - Banka Hesabı7Polimorfizm ve Generic'ler
PolimorfizmTür DönüşümüGeneric FonksiyonlarGeneric TürlerTekrar - Şekil Hesaplayıcı2Struct Yapıları ve Değer Türleri
Struct YapılarıDeğer SemantiğiDeğiştirici MetotlarStruct mı Class mıTekrar - Envanter Öğesi5Kalıtım
Alt sınıflarMetotları Geçersiz KılmaBaşlatıcılar ve superfinal ve HiyerarşilerTekrar - Çalışan Hiyerarşisi11Proje: Kütüphane Yönetimi
Kitaplar ve ÜyelerKitap Ödünç AlmaKendi başına pratik yap: Swift playground