Swift Academy · Lekcja

Klauzule where w funkcjach

Dodawanie szczegółowych ograniczeń do funkcji generycznych.

Lekcja 2 z 413 kroki

Klauzule where w funkcjach to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 2 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.

Poza prostymi ograniczeniami

Ograniczenie takie jak <T: Collection> opisuje sam typ T. Czasami jednak trzeba ograniczyć typy skojarzone typu T, na przykład jego typ Element. Służy do tego klauzula where.

func sumInts<C: Collection>(_ c: C) -> Int where C.Element == Int {
    c.reduce(0, +)
}
print(sumInts([1, 2, 3]))

Wymaganie równości typów

where C.Element == Int wymaga, aby elementy kolekcji były dokładnie typu Int, co umożliwia operacje charakterystyczne dla liczb całkowitych.

func describe<C: Collection>(_ c: C) -> String where C.Element == Int {
    "Sum is " + String(c.reduce(0, +))
}
print(describe(Set([1, 2, 3])))

Wymaganie protokołu dla elementu

Można wymagać, aby element był zgodny z protokołem, zamiast wymagać jednego konkretnego typu, co zapewnia większą elastyczność.

func joinAll<C: Collection>(_ c: C) -> String
    where C.Element: CustomStringConvertible {
    c.map { $0.description }.joined(separator: ", ")
}
print(joinAll([1, 2, 3]))

where po sygnaturze

Klauzula where znajduje się między typem zwracanym a treścią funkcji. Ograniczenia wewnątrz <> i klauzula where współdziałają ze sobą.

func maxElement<C: Collection>(_ c: C) -> C.Element?
    where C.Element: Comparable {
    c.max()
}
print(maxElement([4, 9, 2])!)

Powiązanie dwóch parametrów typu

Klauzula where może powiązać typy elementów dwóch różnych typów generycznych za pomocą ==.

func combine<A: Collection, B: Collection>(_ a: A, _ b: B) -> [A.Element]
    where A.Element == B.Element {
    Array(a) + Array(b)
}
print(combine([1, 2], Set([3])))

Wiele warunków where

Kilka wymagań można zapisać po przecinku, aby wyrazić złożone ograniczenia.

func report<C: Collection>(_ c: C)
    where C.Element: Comparable, C.Element: CustomStringConvertible {
    if let m = c.max() { print("max:", m.description) }
}
report([5, 1, 9])

Ograniczanie zagnieżdżonych typów skojarzonych

Można sięgnąć głębiej, na przykład wymagać określonego typu elementu elementu podczas pracy z zagnieżdżonymi kolekcjami.

func flatten<C: Collection>(_ c: C) -> [Int]
    where C.Element: Collection, C.Element.Element == Int {
    c.flatMap { Array($0) }
}
print(flatten([[1, 2], [3]]))

where z elementami Equatable

Wymaganie elementów zgodnych z Equatable pozwala przeszukiwać generyczną kolekcję.

func indexOf<C: Collection>(_ x: C.Element, in c: C) -> C.Index?
    where C.Element: Equatable {
    c.firstIndex(of: x)
}
if let i = indexOf(2, in: [1, 2, 3]) { print("found") }

Metody generyczne z where

Metody wewnątrz typów generycznych również używają where, często po to, aby dodawać funkcjonalność tylko dla określonych typów elementów.

struct Wrap<T> {
    let items: [T]
    func total() -> Int where T == Int { items.reduce(0, +) }
}
print(Wrap(items: [1, 2, 3]).total())

Korzyść w postaci czytelności

Złożone ograniczenia są czytelniejsze w klauzuli where niż upakowane w nawiasach ostrych, szczególnie gdy obejmują kilka warunków dotyczących typów skojarzonych.

func first<C: Collection>(_ c: C) -> String
    where C.Element: CustomStringConvertible {
    c.first.map { $0.description } ?? "empty"
}
print(first([10, 20]))

where w bibliotece standardowej

Metody takie jak joined() dla sekwencji sekwencji wewnętrznie używają klauzul where, aby precyzyjnie wyrażać swoje wymagania.

let nested = [[1, 2], [3, 4]]
print(Array(nested.joined()))

Szybkie sprawdzenie

Sprawdź swoją wiedzę na temat klauzul where w funkcjach.

Podsumowanie

Klauzule where pozwalają ograniczać typy skojarzone typu generycznego: wymagać, aby element był określonego typu (== Int), był zgodny z protokołem (: Comparable), powiązać elementy dwóch parametrów lub sięgać do zagnieżdżonych typów skojarzonych. Znajdują się za sygnaturą i zwiększają czytelność złożonych ograniczeń.

Bezpłatny start

Ucz się Swift dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
122
Lekcje
409

Często zadawane pytania

Czy lekcja „Klauzule where w funkcjach” jest bezpłatna?

Tak — pełny tekst „Klauzule where w funkcjach” 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 „Klauzule where w funkcjach”?

Dodawanie szczegółowych ograniczeń do funkcji generycznych. Ć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 2 z 4.

Ile czasu zajmuje lekcja „Klauzule where w funkcjach”?

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. Ograniczenia parametrów typów
  2. Klauzule where w funkcjach
  3. Ograniczanie typów powiązanych
  4. Generyczne subskrypty i rozszerzenia
← Powrót do Swift Academy