Klauzule where w funkcjach
Dodawanie szczegółowych ograniczeń do funkcji generycznych.
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ń.
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
- Ograniczenia parametrów typów
- Klauzule where w funkcjach
- Ograniczanie typów powiązanych
- Generyczne subskrypty i rozszerzenia