Budowanie niestandardowych sekwencji leniwych
Tworzenie własnych sekwencji obliczanych leniwie.
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] -- LazyMapSequenceSekwencja 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 1Zatrzymywanie 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:
.lazytworzy opakowania zgodne zLazySequenceProtocol- Należy zaimplementować
SequenceiIteratorProtocol;next()zwracanil, 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ęć.
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
- Właściwość lazy
- Leniwe map i filter
- Kompromisy między leniwym a zachłannym wykonaniem
- Budowanie niestandardowych sekwencji leniwych