Ograniczenia (where), inferencja typów
Ograniczajcie kod generyczny za pomocą where (np. ograniczeń Equatable/Comparable lub Element) i zobaczcie, jak Swift wyprowadza typy generyczne w miejscach wywołań.
Ograniczenia (where), inferencja typów to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 2 z 3. 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 3 lekcji w sumie.
Dlaczego ograniczenia?
Dodanie ograniczeń pozwala kodowi generycznemu używać określonych operacji, takich jak == lub <. Następnie wnioskowanie typów w Swift wybiera konkretne typy podczas wywołań.
Ograniczenie Equatable
where T: Equatable umożliwia sprawdzanie równości. Bez tego == nie jest dostępne dla dowolnego T.
// Find the first index of value in an array of T
func indexOf<T>(_ value: T, in array: [T]) -> Int? where T: Equatable {
for (i, x) in array.enumerated() {
if x == value { return i } // allowed because T: Equatable
}
return nil
}
print(indexOf(3, in: [1,2,3,2]) ?? -1) // 2
print(indexOf("b", in: ["a","b","c"]) ?? -1) // 1Ograniczenie Comparable
Użycie ograniczenia takiego jak T: Comparable umożliwia operacje porządkowania, takie jak <.
// Return the minimum value of a collection when elements are Comparable
func minimum<T: Comparable>(_ xs: [T]) -> T? {
guard var best = xs.first else { return nil }
for x in xs.dropFirst() {
if x < best { best = x }
}
return best
}
print(minimum([7,3,9]) ?? -1) // 3
print(minimum(["b","a","c"]) ?? "?") // "a"Rozszerzenie z where
Należy używać where Element: ..., aby dodawać interfejsy API tylko dla określonych typów elementów, tutaj dla tablic elementów Equatable.
// Add a helper only when the array's Element is Equatable
extension Array where Element: Equatable {
func removingDuplicates() -> [Element] {
var seen: [Element] = []
for x in self {
if !seen.contains(x) { seen.append(x) }
}
return seen
}
}
print([1,2,2,3].removingDuplicates()) // [1,2,3]Wiele ograniczeń
Można łączyć ograniczenia: ograniczać typ generyczny oraz jego typy skojarzone, na przykład S.Element: Equatable.
// Require both Sequence and Equatable elements; force same-type relationship
func allEqual<S>(_ s: S) -> Bool
where S: Sequence, S.Element: Equatable {
var it = s.makeIterator()
guard let first = it.next() else { return true }
while let v = it.next() { if v != first { return false } }
return true
}
print(allEqual([2,2,2])) // true
print(allEqual([1,2,1])) // falseWnioskowanie w praktyce
Swift wnioskuje parametry generyczne na podstawie argumentów i kontekstu, dlatego rzadko trzeba jawnie określać <T>.
// Inference: compiler deduces concrete types
let i = indexOf(10, in: [5,10,15]) // T is Int
let j = minimum(["z","x"]) // T is String
print(i ?? -1, j ?? "")Znaczenie where
Szybkie sprawdzenie: Co robi klauzula where?
Podsumowanie
Podsumowanie: Należy ograniczać generyki za pomocą where, na przykład T: Equatable lub Element: Comparable, i polegać na wnioskowaniu typów w Swift, aby wybierać konkretne typy podczas wywołań.
Często zadawane pytania
Czy lekcja „Ograniczenia (where), inferencja typów” jest bezpłatna?
Tak — pełny tekst „Ograniczenia (where), inferencja typów” 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 3 lekcji w sumie.
Co nauczysz się w „Ograniczenia (where), inferencja typów”?
Ograniczajcie kod generyczny za pomocą where (np. ograniczeń Equatable/Comparable lub Element) i zobaczcie, jak Swift wyprowadza typy generyczne w miejscach wywołań. Ć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 3.
Ile czasu zajmuje lekcja „Ograniczenia (where), inferencja typów”?
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
- Funkcje i typy generyczne
- Ograniczenia (where), inferencja typów
- Algorytmy generyczne na kolekcjach