Swift Academy · Lekcja

Wybór między some, any i typami generycznymi

Wybierz typy generyczne dla jednorodnego typowania statycznego, some P , aby ukryć stały typ konkretny, oraz any P dla heterogenicznego polimorfizmu.

Lekcja 3 z 38 kroki

Wybór między some, any i typami generycznymi to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 3 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.

Kiedy użyć którego rozwiązania?

Zasada praktyczna:

  • Generyki: ten sam konkretny typ przy każdym wywołaniu; najlepsza kontrola w czasie kompilacji i wydajność.
  • some P: ukrywa konkretny typ zwracany, stały dla każdej funkcji.
  • any P: pozwala łączyć typy zgodne z protokołem (heterogeniczność) i korzysta z dynamicznego wywoływania.

Generyki: homogeniczne

Generyki są idealne dla homogenicznych danych i optymalizacji (statycznego wywoływania, inliningu).

protocol Shape { func area() -> Double }

struct Circle: Shape { let r: Double; func area() -> Double { .pi * r * r } }
struct Square: Shape { let s: Double; func area() -> Double { s * s } }

// Generic: one concrete Shape type per call site (homogeneous)
func totalAreaGeneric<S: Sequence, T: Shape>(_ xs: S) -> Double where S.Element == T {
    xs.reduce(0) { $0 + $1.area() }
}
print(totalAreaGeneric([Circle(r:1), Circle(r:2)]))  // OK
// totalAreaGeneric([Circle(r:1), Square(s:2)])      // ❌ different types

Nieprzezroczysty: ukryty, lecz stały

some P zwraca stały, lecz ukryty typ. To świetne rozwiązanie, gdy potrzebna jest enkapsulacja bez utraty wydajności statycznego typowania.

// Opaque factory hides the concrete type while guaranteeing Shape
func unitShape(flag: Bool) -> some Shape {
    // Must return the SAME underlying type on all paths; pick one.
    Circle(r: 1)
}
let s = unitShape(flag: true)
print(String(format: "%.2f", s.area()))  // 3.14

any P: heterogeniczne

any P pozwala umieszczać różne typy w jednej kolekcji lub zmiennej; metody są wywoływane dynamicznie za pośrednictwem interfejsu protokołu.

// Existential: store mixed conformers
let mixed: [any Shape] = [Circle(r: 1), Square(s: 2)]
let sum = mixed.reduce(0) { $0 + $1.area() }   // dynamic dispatch
print(String(format: "%.2f", sum))

Porównanie powierzchni API

Wybierz powierzchnię:

  • Typ generyczny: wywołujący kontroluje konkretny typ.
  • Typ nieprzezroczysty: ukrywasz typ, który pozostaje stały dla każdej funkcji.
  • Typ egzystencjalny: konkretne typy mogą zmieniać się dynamicznie.
// Three API shapes for the same idea: "make a Shape"

// 1) Generic return — exposes concrete type to caller
func makeGeneric<T: Shape>(_ t: T) -> T { t }

// 2) Opaque return — hides concrete type but fixed
func makeOpaqueCircle() -> some Shape { Circle(r: 1) }

// 3) Existential return — can return any conformer
func makeExistential(_ big: Bool) -> any Shape { big ? Square(s: 3) : Circle(r: 1) }

let g: Circle = makeGeneric(Circle(r: 2))      // caller knows concrete type
let o = makeOpaqueCircle()                      // caller sees only Shape
let e = makeExistential(true)                   // could be Circle or Square at runtime
print(g.area(), o.area(), e.area())

Ściągawka

Zalecenia:

  • Należy preferować generyki ze względu na wydajność i silne typowanie, gdy dane są homogeniczne.
  • Należy używać some P, aby ukrywać typy zwracane i zachowywać stabilność API.
  • Należy używać any P w przypadku kolekcji podobnych do wtyczek lub mieszanych.
  • Należy unikać any P dla protokołów z typami powiązanymi/Self, chyba że zastosowano wymazywanie typu.

Sprawdzenie decyzji: wybór some/any/generyków

Szybkie sprawdzenie: Która opcja ukrywa stały konkretny typ zwracany za protokołem P?

Podsumowanie

Podsumowanie:

  • Generyki = homogeniczne, najszybsze, o największej kontroli statycznej.
  • some P = ukryty konkretny typ, stały dla każdej funkcji.
  • any P = heterogeniczność, dynamiczne wywoływanie.
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 „Wybór między some, any i typami generycznymi” jest bezpłatna?

Tak — pełny tekst „Wybór między some, any i typami generycznymi” 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 „Wybór między some, any i typami generycznymi”?

Wybierz typy generyczne dla jednorodnego typowania statycznego, some P , aby ukryć stały typ konkretny, oraz any P dla heterogenicznego polimorfizmu. Ć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 3.

Ile czasu zajmuje lekcja „Wybór między some, any i typami generycznymi”?

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. some P (nieprzezroczyste typy wynikowe): ukrywanie typów konkretnych
  2. any P (egzystencjalny): kompromisy i dynamiczne wywołania
  3. Wybór między some, any i typami generycznymi
← Powrót do Swift Academy