0Pricing
Swift Academy · Lekcja

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))  // true

Sortowanie 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 30

Porzą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:

  • Comparable udostępnia operatory porządku; wystarczy zaimplementować <
  • Umożliwia używanie sorted(), min() i max() bez domknięcia
  • Porównywanie krotek ułatwia ustalanie porządku według wielu kluczy
  • sorted() zwraca nową tablicę, a sort() 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

  1. Syntezowane Equatable
  2. Hashable i hash(into:)
  3. Comparable i sortowanie
  4. Niestandardowa semantyka równości
← Powrót do Swift Academy