Swift Academy · Lekcja

Budowanie niestandardowych sekwencji leniwych

Tworzenie własnych sekwencji obliczanych leniwie.

Lekcja 4 z 413 kroki

Budowanie niestandardowych sekwencji leniwych to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 4 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.

Po co tworzyć własne leniwe sekwencje?

Poza map i filter można tworzyć własne leniwie obliczane sekwencje, na przykład dla nieskończonych generatorów lub kosztownych obliczeniowo strumieni, które powinny być uruchamiane na żądanie.

Typ LazySequence

Wywołanie .lazy opakowuje kolekcję w typ zgodny z LazySequenceProtocol. Dodawane operacje zwracają kolejne leniwe opakowania:

let view = [1, 2, 3].lazy
let mapped = view.map { $0 * 2 }
print(Array(mapped))  // [2, 4, 6]  -- LazyMapSequence

Sekwencja oparta na pobieraniu

Niestandardowe sekwencje działają w modelu pobierania: każde wywołanie iteratora oblicza następną wartość dopiero wtedy, gdy jest potrzebna. Oto generator Fibonacciego:

struct Fibonacci: Sequence, IteratorProtocol {
    var a = 0, b = 1
    mutating func next() -> Int? {
        let r = a
        (a, b) = (b, a + b)
        return r
    }
}
print(Array(Fibonacci().prefix(6)))  // [0, 1, 1, 2, 3, 5]

Nieskończona sekwencja wykorzystywana leniwie

Ponieważ wartości są pobierane na żądanie, nieskończona sekwencja jest bezpieczna, o ile pobierany jest tylko skończony fragment:

struct Naturals: Sequence, IteratorProtocol {
    var n = 1
    mutating func next() -> Int? { defer { n += 1 }; return n }
}
print(Array(Naturals().prefix(4)))  // [1, 2, 3, 4]

Zgodność z LazySequenceProtocol

Przyjęcie LazySequenceProtocol umożliwia także łańcuchowe, leniwe używanie map/filter we własnym typie:

struct Counter: Sequence, IteratorProtocol, LazySequenceProtocol {
    var n = 0; let limit: Int
    mutating func next() -> Int? {
        guard n < limit else { return nil }
        defer { n += 1 }
        return n
    }
}
print(Array(Counter(n: 0, limit: 3).map { $0 * 10 }))  // [0, 10, 20]

sequence(first:next:)

Biblioteka standardowa udostępnia konstruktor niestandardowych leniwych sekwencji, który nie wymaga tworzenia nowego typu:

let powers = sequence(first: 1) { $0 <= 16 ? $0 * 2 : nil }
print(Array(powers))  // [1, 2, 4, 8, 16, 32]

sequence(state:next:)

Między kolejnymi krokami można przechowywać bardziej złożony stan:

let fibs = sequence(state: (0, 1)) { (s: inout (Int, Int)) -> Int? in
    let r = s.0
    s = (s.1, s.0 + s.1)
    return r
}
print(Array(fibs.prefix(6)))  // [0, 1, 1, 2, 3, 5]

Opakowanie AnySequence

Podczas udostępniania API można ukryć konkretny typ za pomocą AnySequence:

func evens(upTo n: Int) -> AnySequence<Int> {
    AnySequence((0...n).lazy.filter { $0 % 2 == 0 })
}
print(Array(evens(upTo: 8)))  // [0, 2, 4, 6, 8]

Leniwy strumień obliczany

Kosztowne operacje należy odroczyć do momentu faktycznego pobrania każdego elementu:

let stream = (1...5).lazy.map { (n: Int) -> Int in
    print("computing \(n)")
    return n * n
}
print(stream.first!)  // computing 1, then 1

Zatrzymywanie generatora

Należy zwrócić nil z next(), aby poprawnie zakończyć sekwencję:

let countdown = sequence(state: 3) { (s: inout Int) -> Int? in
    guard s > 0 else { return nil }
    defer { s -= 1 }
    return s
}
print(Array(countdown))  // [3, 2, 1]

Połączenie wszystkiego

Można połączyć niestandardowy generator z leniwymi operatorami, tworząc potok działający na żądanie:

let primesIsh = sequence(first: 2) { $0 < 20 ? $0 + 1 : nil }
    .lazy
    .filter { n in (2..<n).allSatisfy { n % $0 != 0 } }
print(Array(primesIsh))  // [2, 3, 5, 7, 11, 13, 17, 19]

Szybkie sprawdzenie

Co sygnalizuje koniec niestandardowej sekwencji IteratorProtocol?

Podsumowanie

Poznał(a) Pan/Pani niestandardowe leniwe sekwencje:

  • .lazy tworzy opakowania zgodne z LazySequenceProtocol
  • Należy zaimplementować Sequence i IteratorProtocol; next() zwraca nil, aby zatrzymać sekwencję
  • Do szybkiego tworzenia można użyć sequence(first:next:) / sequence(state:next:)
  • Można opakować sekwencję w AnySequence, aby ukryć konkretne typy

Kurs ukończony! Dalej: szczegółowe omówienie domknięć.

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 „Budowanie niestandardowych sekwencji leniwych” jest bezpłatna?

Tak — pełny tekst „Budowanie niestandardowych sekwencji leniwych” 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 „Budowanie niestandardowych sekwencji leniwych”?

Tworzenie własnych sekwencji obliczanych leniwie. Ć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 4 z 4.

Ile czasu zajmuje lekcja „Budowanie niestandardowych sekwencji leniwych”?

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. Właściwość lazy
  2. Leniwe map i filter
  3. Kompromisy między leniwym a zachłannym wykonaniem
  4. Budowanie niestandardowych sekwencji leniwych
← Powrót do Swift Academy