Comparable
Część sekcji Programowanie obiektowe ścieżki Swift w Coddy. Lekcja 39 z 57.
Comparable nadaje typowi operatory <, <=, > i >=. Implementujesz tylko <; Swift wyprowadza pozostałe operatory. Typy zgodne z Comparable można sortować za pomocą sorted() oraz używać z min() i 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)" })Wynik:
2.1
["1.9", "2.0", "2.1"]Porównanie krotek porównuje ich elementy po kolei, dzięki czemu porównania wielokluczowe są krótkie. Tutaj zadania są sortowane najpierw według priorytetu, a następnie według nazwy:
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 })Wynik:
["fix", "call", "email"]Typy wyliczeniowe bez powiązanych wartości mogą implementować protokół Comparable bez zapisywania <: przypadki są porównywane w kolejności, w jakiej zostały zadeklarowane:
enum Priority: Comparable {
case low, medium, high
}
print(Priority.low < Priority.high)
print([Priority.high, .low, .medium].sorted())Wynik:
true
[main.Priority.low, main.Priority.medium, main.Priority.high]sorted(by:) sortuje według dowolnej reguły na potrzeby jednego wywołania, natomiast Comparable definiuje naturalny porządek danego typu, którego wszędzie używają sorted(), min() i 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 })Wynik:
["a", "c"]
["c", "a"]Wyzwanie
ŁatwySpraw, aby Runner (nazwa i czas ukończenia jako minutes, seconds) spełniał wymagania protokołu Comparable, gdzie krótszy czas jest mniejszy, a przy równych czasach kolejność ustala nazwa. Uzupełnij podium(_:), która sortuje biegaczy za pomocą sorted() i zwraca linie w formacie 1. Ada 20:05 dla pierwszych trzech osób (mniej, jeśli jest mniej biegaczy), z sekundami uzupełnionymi do dwóch cyfr.
Dostarczony kod odczytuje wiersze w formacie name,mm:ss i wyświetla każdą zwróconą linię.
Twój kod umieść w plikach Runner.swift i Functions.swift. Plik main.swift zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
// Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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) }
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Klasy i obiekty
Praca z plikamiDefiniowanie klasMetody i selfInicjalizatoryKlasy są referencjamiPowtórzenie — karta biblioteczna4Hermetyzacja
Kontrola dostępuTylko do odczytu z zewnątrzOchrona stanuInicjalizatory, które mogą zawieśćPodsumowanie — konto bankowe7Polimorfizm i typy generyczne
PolimorfizmRzutowanie typówFunkcje generyczneTypy generycznePodsumowanie – kalkulator kształtów2Struktury i typy wartościowe
StrukturySemantyka wartościMetody modyfikująceStruktura czy klasaPodsumowanie – element inwentarza5Dziedziczenie
PodklasyPrzesłanianie metodInicjalizatory i superfinal i hierarchiePodsumowanie — hierarchia pracowników8Standardowe protokoły
CustomStringConvertibleEquatableComparableHashablePodsumowanie — własne sortowanie11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książekPoćwicz samodzielnie: Edytor online Swift