Przechwytywanie wartości
Część sekcji Logika i przepływ programu ścieżki Swift w Coddy. Lekcja 40 z 56.
Domknięcie zapamiętuje zmienne, które były w zakresie widoczności w chwili jego utworzenia. Treść domknięcia może później je odczytywać, a nawet modyfikować, także po zakończeniu działania otaczającej je funkcji. Nazywa się to przechwytywaniem.
func makeCounter() -> () -> Int {
var count = 0
return {
count += 1
return count
}
}
let next = makeCounter()
print(next()) // 1
print(next()) // 2
print(next()) // 3Każde wywołanie makeCounter daje ci zupełnie nowe count, więc dwa liczniki nigdy nie współdzielą stanu:
let a = makeCounter()
let b = makeCounter()
print(a()) // 1
print(b()) // 1
print(a()) // 2Przechwytywanie sprawia, że domknięcia są potężniejsze niż zwykłe funkcje: przenoszą ze sobą stan. Zobaczysz tę samą sztuczkę w JavaScript, Pythonie i wielu innych językach.
Wyzwanie
ŚredniZbuduj prostą fabrykę liczników.
Zdefiniuj funkcję makeCounter(start: Int, step: Int), która zwraca domknięcie typu () -> Int. Każde wywołanie domknięcia zwraca kolejną wartość: pierwsze wywołanie zwraca start, następne zwraca start + step, kolejne start + 2*step i tak dalej.
Wczytaj trzy liczby całkowite: start, step i n. Utwórz licznik z użyciem start i step, następnie wywołaj go n razy i wypisz każdy wynik w osobnym wierszu.
Dla danych wejściowych 5 / 3 / 4 wynikiem jest:
5
8
11
14Spróbuj swoich sił
let start = Int(readLine()!)!
let step = Int(readLine()!)!
let n = Int(readLine()!)!
// TODO: utwórz makeCounter(start:step:) -> () -> Int, która przechwytuje bieżącą wartość
// następnie wywołaj ją n razy i wypisz każdy wynik
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Logika i przepływ programu
1Dogłębnie o ciągach znaków
Liczba i indeksyWielkość liter i usuwanie białych znakówWyszukiwanie w ciągach znakówDzielenie i łączenieZastępowanie podciągówPodsumowanie — sprawdzanie nazwy użytkownika4Zbiory
Tworzenie zbiorówSuma i część wspólnaRóżnica i różnica symetrycznaPodzbiór i nadzbiórPowtórka — filtr tagów7Projekt – Śledzenie nawyków
Przegląd projektuOznacz jako wykonane10Projekt — silnik quizów
Przegląd projektuZadawanie pytań2Zakresy i kroki
Zakresy domknięte i półotwarteKrokMetody zakresówZakresy w instrukcji switchPowtórka — siatka kalendarza5Funkcje wyższego rzędu, część 1
MapFilterReduceŁączenie map, filter i reducePodsumowanie – statystyki słów8Domknięcia
Podstawy domknięćDomknięcia końcowePrzechwytywanie wartościZwracanie domknięćWłasne funkcje wyższego rzęduPodsumowanie – konstruktor potokówPoćwicz samodzielnie: Edytor online Swift