Comparable i sortowanie
Definiowanie kolejności za pomocą < na potrzeby sortowania.
Comparable i sortowanie to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Swift Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Swift Academy zawiera 4 lekcji w sumie.
Czym jest Comparable
Comparable udostępnia typowi operatory porządku: <, <=, >, >=. Zapewnienie zgodności pozwala bezpośrednio wywoływać sorted(), min() i max().
Zgodność z <
Wystarczy zaimplementować <; pozostałe operatory są wyprowadzane automatycznie. (Wymagana jest również zgodność z Equatable).
struct Version: Comparable {
let major: Int
static func < (l: Version, r: Version) -> Bool { l.major < r.major }
}
print(Version(major: 1) < Version(major: 2)) // trueSortowanie typu Comparable
W przypadku Comparable metoda sorted() nie wymaga domknięcia:
struct Score: Comparable {
let points: Int
static func < (l: Score, r: Score) -> Bool { l.points < r.points }
}
let sorted = [Score(points: 3), Score(points: 1), Score(points: 2)].sorted()
print(sorted.map { $0.points }) // [1, 2, 3]min i max bez dodatkowego kodu
Comparable udostępnia również funkcje pomocnicze agregujące:
struct Temp: Comparable {
let c: Int
static func < (l: Temp, r: Temp) -> Bool { l.c < r.c }
}
let temps = [Temp(c: 20), Temp(c: 5), Temp(c: 30)]
print(temps.min()!.c, temps.max()!.c) // 5 30Porządek według wielu kluczy
Aby rozstrzygać remisy na podstawie kilku pól, należy porównywać je w kolejności priorytetów wewnątrz <, używając krotek — Swift porównuje krotki leksykograficznie.
Sposób na porównywanie krotek
Porównywanie według nazwiska, a następnie imienia:
struct Person: Comparable {
let last: String
let first: String
static func < (l: Person, r: Person) -> Bool {
(l.last, l.first) < (r.last, r.first)
}
}
let p = [Person(last: "Lee", first: "Bo"), Person(last: "Lee", first: "An")].sorted()
print(p.map { $0.first }) // ["An", "Bo"]Sortowanie bez Comparable
Zawsze można sortować za pomocą domknięcia przekazanego na końcu, nawet jeśli typ nie jest zgodny z Comparable:
struct Item { let name: String; let qty: Int }
let items = [Item(name: "B", qty: 2), Item(name: "A", qty: 5)]
let byQty = items.sorted { $0.qty > $1.qty }
print(byQty.map { $0.name }) // ["A", "B"]Sortowanie malejące
Należy odwrócić porównanie lub wywołać .reversed():
let nums = [3, 1, 4, 1, 5]
print(nums.sorted(by: >)) // [5, 4, 3, 1, 1]
print(nums.sorted().reversed()) // [5, 4, 3, 1, 1]sorted a sort
sorted() zwraca nową tablicę, a sort() modyfikuje tablicę w miejscu (wymaga zmiennej zadeklarowanej za pomocą var):
var nums = [3, 1, 2]
nums.sort()
print(nums) // [1, 2, 3]
let copy = [3, 1, 2].sorted()
print(copy) // [1, 2, 3]Sortowanie wystarczająco stabilne
Sortowanie w Swift jest stabilne od wersji Swift 5: elementy równe zachowują swoją kolejność względną. Można na tym polegać w przypadku przewidywalnego sortowania wieloetapowego:
let words = ["bb", "a", "cc", "d"]
let byLen = words.sorted { $0.count < $1.count }
print(byLen) // ["a", "d", "bb", "cc"] -- "a" before "d", "bb" before "cc"Sortowanie według ścieżki klucza
Można sortować za pomocą domknięcia odczytującego dowolną właściwość bez zapewniania zgodności całego typu:
struct Player { let name: String; let score: Int }
let players = [Player(name: "A", score: 30), Player(name: "B", score: 50)]
let ranked = players.sorted { $0.score > $1.score }
print(ranked.map { $0.name }) // ["B", "A"]Szybkie sprawdzenie
Jaki pojedynczy operator trzeba zaimplementować, aby zapewnić zgodność z Comparable?
Podsumowanie
Poznali Państwo Comparable:
Comparableudostępnia operatory porządku; wystarczy zaimplementować<- Umożliwia używanie
sorted(),min()imax()bez domknięcia - Porównywanie krotek ułatwia ustalanie porządku według wielu kluczy
sorted()zwraca nową tablicę, asort()ją modyfikuje; sortowanie jest stabilne
Następnie: niestandardowe zasady równości.
Często zadawane pytania
Czy lekcja „Comparable i sortowanie” jest bezpłatna?
Tak — pełny tekst „Comparable i sortowanie” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Swift Academy, przejdź na CoddyKit PRO. Kurs Swift Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Comparable i sortowanie”?
Definiowanie kolejności za pomocą < na potrzeby sortowania. Ćwiczysz Swift Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Swift Academy?
Nie wymagamy żadnego doświadczenia. Swift Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Comparable i sortowanie”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Swift Academy?
Tak. Każda lekcja Swift Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Syntezowane Equatable
- Hashable i hash(into:)
- Comparable i sortowanie
- Niestandardowa semantyka równości