0Pricing
Swift Academy · Lekcja

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

Ograniczenie 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]))   // false

Wnioskowanie 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

  1. Funkcje i typy generyczne
  2. Ograniczenia (where), inferencja typów
  3. Algorytmy generyczne na kolekcjach
← Powrót do Swift Academy